Updates

Update 2021.08.11

Most thorough way to readdress differences between original and current analyses is to jsut redo the biomark. To that end, will restart analysis of just CMPm2, excluding other datasets (i.e., LSK, MEP, GMP). Will also keep

Notebook setup

Creating new pipeline using seurat v4.0.2 available 2021.06.08

Load libraries required for Seuratv4

library(dplyr)
library(Seurat)
library(patchwork)
library(ggplot2)
library(clustree)

Set global variables

projectName <- "CMP"
jackstraw.dim <- 40

store session info

sessionInfo.filename <- paste0(projectName, "_sessionInfo.txt")
sink(sessionInfo.filename)
sessionInfo()
sink()
source("../RFunctions/read_10XGenomics_data.R")
source("../RFunctions/PercentVariance.R")
source("../RFunctions/Mouse2Human_idconversion.R")
source ("../RFunctions/ColorPalette.R")
setwd("../../cellRanger/") # temporarily changing wd only works if you run the entire chunk at once
data_file.list <- read_10XGenomics_data(sample.list = "CMPm2")
object.data <-Read10X(data_file.list)
cmp.object<- CreateSeuratObject(counts = object.data, min.cells = 3, min.genes = 200, project = projectName)

Clean up to free memory

remove(object.data)

Add mitochondrial metadata and plot some basic features

cmp.object[["percent.mt"]] <- PercentageFeatureSet(cmp.object, pattern = "^mt-")
VlnPlot(cmp.object, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3, pt.size = 0, fill.by = 'orig.ident', )

plot1 <- FeatureScatter(cmp.object, feature1 = "nCount_RNA", feature2 = "percent.mt", group.by = "orig.ident", pt.size = 0.01)
plot2 <- FeatureScatter(cmp.object, feature1 = "nCount_RNA", feature2 = "nFeature_RNA", group.by = "orig.ident", pt.size = 0.01)
plot1 + plot2

Filter data

remove low quality cells require: nFeature_RNA between 200 and 4000 (inclusive) require: percent.mt <=5

print(paste("original object:", nrow(cmp.object@meta.data), "cells", sep = " "))
[1] "original object: 12540 cells"
cmp.object <- subset(cmp.object, 
                                                subset = nFeature_RNA >=200 & 
                                                    nFeature_RNA <= 4000 & 
                                                    percent.mt <= 5
                                                )
print(paste("new object:", nrow(cmp.object@meta.data), "cells", sep = " "))
[1] "new object: 12059 cells"
cmp.object <- NormalizeData(cmp.object, normalization.method = "LogNormalize", scale.factor = 10000)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

Find variable features

cmp.object <- FindVariableFeatures(cmp.object, selection.method = "vst", nfeatures = 2000)
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
top10 <- head(VariableFeatures(cmp.object), 10)
plot1 <- VariableFeaturePlot(cmp.object)
plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)
When using repel, set xnudge and ynudge to 0 for optimal results
plot1 + plot2

Scale data (linear transformation)

We don’t have to worry about comparing library depths, so we’ll just do normalization/Scale data

Regressing out nFeature_RNA, nCount_RNA

  |                                                                                                                                                                                                                      
  |                                                                                                                                                                                                                |   0%
  |                                                                                                                                                                                                                      
  |=                                                                                                                                                                                                               |   0%
  |                                                                                                                                                                                                                      
  |=                                                                                                                                                                                                               |   1%
  |                                                                                                                                                                                                                      
  |==                                                                                                                                                                                                              |   1%
  |                                                                                                                                                                                                                      
  |===                                                                                                                                                                                                             |   1%
  |                                                                                                                                                                                                                      
  |===                                                                                                                                                                                                             |   2%
  |                                                                                                                                                                                                                      
  |====                                                                                                                                                                                                            |   2%
  |                                                                                                                                                                                                                      
  |=====                                                                                                                                                                                                           |   2%
  |                                                                                                                                                                                                                      
  |=====                                                                                                                                                                                                           |   3%
  |                                                                                                                                                                                                                      
  |======                                                                                                                                                                                                          |   3%
  |                                                                                                                                                                                                                      
  |=======                                                                                                                                                                                                         |   3%
  |                                                                                                                                                                                                                      
  |=======                                                                                                                                                                                                         |   4%
  |                                                                                                                                                                                                                      
  |========                                                                                                                                                                                                        |   4%
  |                                                                                                                                                                                                                      
  |=========                                                                                                                                                                                                       |   4%
  |                                                                                                                                                                                                                      
  |=========                                                                                                                                                                                                       |   5%
  |                                                                                                                                                                                                                      
  |==========                                                                                                                                                                                                      |   5%
  |                                                                                                                                                                                                                      
  |===========                                                                                                                                                                                                     |   5%
  |                                                                                                                                                                                                                      
  |===========                                                                                                                                                                                                     |   6%
  |                                                                                                                                                                                                                      
  |============                                                                                                                                                                                                    |   6%
  |                                                                                                                                                                                                                      
  |=============                                                                                                                                                                                                   |   6%
  |                                                                                                                                                                                                                      
  |==============                                                                                                                                                                                                  |   6%
  |                                                                                                                                                                                                                      
  |==============                                                                                                                                                                                                  |   7%
  |                                                                                                                                                                                                                      
  |===============                                                                                                                                                                                                 |   7%
  |                                                                                                                                                                                                                      
  |================                                                                                                                                                                                                |   7%
  |                                                                                                                                                                                                                      
  |================                                                                                                                                                                                                |   8%
  |                                                                                                                                                                                                                      
  |=================                                                                                                                                                                                               |   8%
  |                                                                                                                                                                                                                      
  |==================                                                                                                                                                                                              |   8%
  |                                                                                                                                                                                                                      
  |==================                                                                                                                                                                                              |   9%
  |                                                                                                                                                                                                                      
  |===================                                                                                                                                                                                             |   9%
  |                                                                                                                                                                                                                      
  |====================                                                                                                                                                                                            |   9%
  |                                                                                                                                                                                                                      
  |====================                                                                                                                                                                                            |  10%
  |                                                                                                                                                                                                                      
  |=====================                                                                                                                                                                                           |  10%
  |                                                                                                                                                                                                                      
  |======================                                                                                                                                                                                          |  10%
  |                                                                                                                                                                                                                      
  |======================                                                                                                                                                                                          |  11%
  |                                                                                                                                                                                                                      
  |=======================                                                                                                                                                                                         |  11%
  |                                                                                                                                                                                                                      
  |========================                                                                                                                                                                                        |  11%
  |                                                                                                                                                                                                                      
  |========================                                                                                                                                                                                        |  12%
  |                                                                                                                                                                                                                      
  |=========================                                                                                                                                                                                       |  12%
  |                                                                                                                                                                                                                      
  |==========================                                                                                                                                                                                      |  12%
  |                                                                                                                                                                                                                      
  |==========================                                                                                                                                                                                      |  13%
  |                                                                                                                                                                                                                      
  |===========================                                                                                                                                                                                     |  13%
  |                                                                                                                                                                                                                      
  |============================                                                                                                                                                                                    |  13%
  |                                                                                                                                                                                                                      
  |============================                                                                                                                                                                                    |  14%
  |                                                                                                                                                                                                                      
  |=============================                                                                                                                                                                                   |  14%
  |                                                                                                                                                                                                                      
  |==============================                                                                                                                                                                                  |  14%
  |                                                                                                                                                                                                                      
  |==============================                                                                                                                                                                                  |  15%
  |                                                                                                                                                                                                                      
  |===============================                                                                                                                                                                                 |  15%
  |                                                                                                                                                                                                                      
  |================================                                                                                                                                                                                |  15%
  |                                                                                                                                                                                                                      
  |================================                                                                                                                                                                                |  16%
  |                                                                                                                                                                                                                      
  |=================================                                                                                                                                                                               |  16%
  |                                                                                                                                                                                                                      
  |==================================                                                                                                                                                                              |  16%
  |                                                                                                                                                                                                                      
  |==================================                                                                                                                                                                              |  17%
  |                                                                                                                                                                                                                      
  |===================================                                                                                                                                                                             |  17%
  |                                                                                                                                                                                                                      
  |====================================                                                                                                                                                                            |  17%
  |                                                                                                                                                                                                                      
  |====================================                                                                                                                                                                            |  18%
  |                                                                                                                                                                                                                      
  |=====================================                                                                                                                                                                           |  18%
  |                                                                                                                                                                                                                      
  |======================================                                                                                                                                                                          |  18%
  |                                                                                                                                                                                                                      
  |======================================                                                                                                                                                                          |  19%
  |                                                                                                                                                                                                                      
  |=======================================                                                                                                                                                                         |  19%
  |                                                                                                                                                                                                                      
  |========================================                                                                                                                                                                        |  19%
  |                                                                                                                                                                                                                      
  |=========================================                                                                                                                                                                       |  19%
  |                                                                                                                                                                                                                      
  |=========================================                                                                                                                                                                       |  20%
  |                                                                                                                                                                                                                      
  |==========================================                                                                                                                                                                      |  20%
  |                                                                                                                                                                                                                      
  |===========================================                                                                                                                                                                     |  20%
  |                                                                                                                                                                                                                      
  |===========================================                                                                                                                                                                     |  21%
  |                                                                                                                                                                                                                      
  |============================================                                                                                                                                                                    |  21%
  |                                                                                                                                                                                                                      
  |=============================================                                                                                                                                                                   |  21%
  |                                                                                                                                                                                                                      
  |=============================================                                                                                                                                                                   |  22%
  |                                                                                                                                                                                                                      
  |==============================================                                                                                                                                                                  |  22%
  |                                                                                                                                                                                                                      
  |===============================================                                                                                                                                                                 |  22%
  |                                                                                                                                                                                                                      
  |===============================================                                                                                                                                                                 |  23%
  |                                                                                                                                                                                                                      
  |================================================                                                                                                                                                                |  23%
  |                                                                                                                                                                                                                      
  |=================================================                                                                                                                                                               |  23%
  |                                                                                                                                                                                                                      
  |=================================================                                                                                                                                                               |  24%
  |                                                                                                                                                                                                                      
  |==================================================                                                                                                                                                              |  24%
  |                                                                                                                                                                                                                      
  |===================================================                                                                                                                                                             |  24%
  |                                                                                                                                                                                                                      
  |===================================================                                                                                                                                                             |  25%
  |                                                                                                                                                                                                                      
  |====================================================                                                                                                                                                            |  25%
  |                                                                                                                                                                                                                      
  |=====================================================                                                                                                                                                           |  25%
  |                                                                                                                                                                                                                      
  |=====================================================                                                                                                                                                           |  26%
  |                                                                                                                                                                                                                      
  |======================================================                                                                                                                                                          |  26%
  |                                                                                                                                                                                                                      
  |=======================================================                                                                                                                                                         |  26%
  |                                                                                                                                                                                                                      
  |=======================================================                                                                                                                                                         |  27%
  |                                                                                                                                                                                                                      
  |========================================================                                                                                                                                                        |  27%
  |                                                                                                                                                                                                                      
  |=========================================================                                                                                                                                                       |  27%
  |                                                                                                                                                                                                                      
  |=========================================================                                                                                                                                                       |  28%
  |                                                                                                                                                                                                                      
  |==========================================================                                                                                                                                                      |  28%
  |                                                                                                                                                                                                                      
  |===========================================================                                                                                                                                                     |  28%
  |                                                                                                                                                                                                                      
  |===========================================================                                                                                                                                                     |  29%
  |                                                                                                                                                                                                                      
  |============================================================                                                                                                                                                    |  29%
  |                                                                                                                                                                                                                      
  |=============================================================                                                                                                                                                   |  29%
  |                                                                                                                                                                                                                      
  |=============================================================                                                                                                                                                   |  30%
  |                                                                                                                                                                                                                      
  |==============================================================                                                                                                                                                  |  30%
  |                                                                                                                                                                                                                      
  |===============================================================                                                                                                                                                 |  30%
  |                                                                                                                                                                                                                      
  |===============================================================                                                                                                                                                 |  31%
  |                                                                                                                                                                                                                      
  |================================================================                                                                                                                                                |  31%
  |                                                                                                                                                                                                                      
  |=================================================================                                                                                                                                               |  31%
  |                                                                                                                                                                                                                      
  |==================================================================                                                                                                                                              |  31%
  |                                                                                                                                                                                                                      
  |==================================================================                                                                                                                                              |  32%
  |                                                                                                                                                                                                                      
  |===================================================================                                                                                                                                             |  32%
  |                                                                                                                                                                                                                      
  |====================================================================                                                                                                                                            |  32%
  |                                                                                                                                                                                                                      
  |====================================================================                                                                                                                                            |  33%
  |                                                                                                                                                                                                                      
  |=====================================================================                                                                                                                                           |  33%
  |                                                                                                                                                                                                                      
  |======================================================================                                                                                                                                          |  33%
  |                                                                                                                                                                                                                      
  |======================================================================                                                                                                                                          |  34%
  |                                                                                                                                                                                                                      
  |=======================================================================                                                                                                                                         |  34%
  |                                                                                                                                                                                                                      
  |========================================================================                                                                                                                                        |  34%
  |                                                                                                                                                                                                                      
  |========================================================================                                                                                                                                        |  35%
  |                                                                                                                                                                                                                      
  |=========================================================================                                                                                                                                       |  35%
  |                                                                                                                                                                                                                      
  |==========================================================================                                                                                                                                      |  35%
  |                                                                                                                                                                                                                      
  |==========================================================================                                                                                                                                      |  36%
  |                                                                                                                                                                                                                      
  |===========================================================================                                                                                                                                     |  36%
  |                                                                                                                                                                                                                      
  |============================================================================                                                                                                                                    |  36%
  |                                                                                                                                                                                                                      
  |============================================================================                                                                                                                                    |  37%
  |                                                                                                                                                                                                                      
  |=============================================================================                                                                                                                                   |  37%
  |                                                                                                                                                                                                                      
  |==============================================================================                                                                                                                                  |  37%
  |                                                                                                                                                                                                                      
  |==============================================================================                                                                                                                                  |  38%
  |                                                                                                                                                                                                                      
  |===============================================================================                                                                                                                                 |  38%
  |                                                                                                                                                                                                                      
  |================================================================================                                                                                                                                |  38%
  |                                                                                                                                                                                                                      
  |================================================================================                                                                                                                                |  39%
  |                                                                                                                                                                                                                      
  |=================================================================================                                                                                                                               |  39%
  |                                                                                                                                                                                                                      
  |==================================================================================                                                                                                                              |  39%
  |                                                                                                                                                                                                                      
  |==================================================================================                                                                                                                              |  40%
  |                                                                                                                                                                                                                      
  |===================================================================================                                                                                                                             |  40%
  |                                                                                                                                                                                                                      
  |====================================================================================                                                                                                                            |  40%
  |                                                                                                                                                                                                                      
  |====================================================================================                                                                                                                            |  41%
  |                                                                                                                                                                                                                      
  |=====================================================================================                                                                                                                           |  41%
  |                                                                                                                                                                                                                      
  |======================================================================================                                                                                                                          |  41%
  |                                                                                                                                                                                                                      
  |======================================================================================                                                                                                                          |  42%
  |                                                                                                                                                                                                                      
  |=======================================================================================                                                                                                                         |  42%
  |                                                                                                                                                                                                                      
  |========================================================================================                                                                                                                        |  42%
  |                                                                                                                                                                                                                      
  |========================================================================================                                                                                                                        |  43%
  |                                                                                                                                                                                                                      
  |=========================================================================================                                                                                                                       |  43%
  |                                                                                                                                                                                                                      
  |==========================================================================================                                                                                                                      |  43%
  |                                                                                                                                                                                                                      
  |==========================================================================================                                                                                                                      |  44%
  |                                                                                                                                                                                                                      
  |===========================================================================================                                                                                                                     |  44%
  |                                                                                                                                                                                                                      
  |============================================================================================                                                                                                                    |  44%
  |                                                                                                                                                                                                                      
  |=============================================================================================                                                                                                                   |  44%
  |                                                                                                                                                                                                                      
  |=============================================================================================                                                                                                                   |  45%
  |                                                                                                                                                                                                                      
  |==============================================================================================                                                                                                                  |  45%
  |                                                                                                                                                                                                                      
  |===============================================================================================                                                                                                                 |  45%
  |                                                                                                                                                                                                                      
  |===============================================================================================                                                                                                                 |  46%
  |                                                                                                                                                                                                                      
  |================================================================================================                                                                                                                |  46%
  |                                                                                                                                                                                                                      
  |=================================================================================================                                                                                                               |  46%
  |                                                                                                                                                                                                                      
  |=================================================================================================                                                                                                               |  47%
  |                                                                                                                                                                                                                      
  |==================================================================================================                                                                                                              |  47%
  |                                                                                                                                                                                                                      
  |===================================================================================================                                                                                                             |  47%
  |                                                                                                                                                                                                                      
  |===================================================================================================                                                                                                             |  48%
  |                                                                                                                                                                                                                      
  |====================================================================================================                                                                                                            |  48%
  |                                                                                                                                                                                                                      
  |=====================================================================================================                                                                                                           |  48%
  |                                                                                                                                                                                                                      
  |=====================================================================================================                                                                                                           |  49%
  |                                                                                                                                                                                                                      
  |======================================================================================================                                                                                                          |  49%
  |                                                                                                                                                                                                                      
  |=======================================================================================================                                                                                                         |  49%
  |                                                                                                                                                                                                                      
  |=======================================================================================================                                                                                                         |  50%
  |                                                                                                                                                                                                                      
  |========================================================================================================                                                                                                        |  50%
  |                                                                                                                                                                                                                      
  |=========================================================================================================                                                                                                       |  50%
  |                                                                                                                                                                                                                      
  |=========================================================================================================                                                                                                       |  51%
  |                                                                                                                                                                                                                      
  |==========================================================================================================                                                                                                      |  51%
  |                                                                                                                                                                                                                      
  |===========================================================================================================                                                                                                     |  51%
  |                                                                                                                                                                                                                      
  |===========================================================================================================                                                                                                     |  52%
  |                                                                                                                                                                                                                      
  |============================================================================================================                                                                                                    |  52%
  |                                                                                                                                                                                                                      
  |=============================================================================================================                                                                                                   |  52%
  |                                                                                                                                                                                                                      
  |=============================================================================================================                                                                                                   |  53%
  |                                                                                                                                                                                                                      
  |==============================================================================================================                                                                                                  |  53%
  |                                                                                                                                                                                                                      
  |===============================================================================================================                                                                                                 |  53%
  |                                                                                                                                                                                                                      
  |===============================================================================================================                                                                                                 |  54%
  |                                                                                                                                                                                                                      
  |================================================================================================================                                                                                                |  54%
  |                                                                                                                                                                                                                      
  |=================================================================================================================                                                                                               |  54%
  |                                                                                                                                                                                                                      
  |=================================================================================================================                                                                                               |  55%
  |                                                                                                                                                                                                                      
  |==================================================================================================================                                                                                              |  55%
  |                                                                                                                                                                                                                      
  |===================================================================================================================                                                                                             |  55%
  |                                                                                                                                                                                                                      
  |===================================================================================================================                                                                                             |  56%
  |                                                                                                                                                                                                                      
  |====================================================================================================================                                                                                            |  56%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================                                                                                           |  56%
  |                                                                                                                                                                                                                      
  |======================================================================================================================                                                                                          |  56%
  |                                                                                                                                                                                                                      
  |======================================================================================================================                                                                                          |  57%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================                                                                                         |  57%
  |                                                                                                                                                                                                                      
  |========================================================================================================================                                                                                        |  57%
  |                                                                                                                                                                                                                      
  |========================================================================================================================                                                                                        |  58%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================                                                                                       |  58%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================                                                                                      |  58%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================                                                                                      |  59%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================                                                                                     |  59%
  |                                                                                                                                                                                                                      
  |============================================================================================================================                                                                                    |  59%
  |                                                                                                                                                                                                                      
  |============================================================================================================================                                                                                    |  60%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================                                                                                   |  60%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================                                                                                  |  60%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================                                                                                  |  61%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================                                                                                 |  61%
  |                                                                                                                                                                                                                      
  |================================================================================================================================                                                                                |  61%
  |                                                                                                                                                                                                                      
  |================================================================================================================================                                                                                |  62%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================                                                                               |  62%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================                                                                              |  62%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================                                                                              |  63%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================                                                                             |  63%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================                                                                            |  63%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================                                                                            |  64%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================                                                                           |  64%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================                                                                          |  64%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================                                                                          |  65%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================                                                                         |  65%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================                                                                        |  65%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================                                                                        |  66%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================                                                                       |  66%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================                                                                      |  66%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================                                                                      |  67%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================                                                                     |  67%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================                                                                    |  67%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================                                                                    |  68%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================                                                                   |  68%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================                                                                  |  68%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================                                                                  |  69%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================                                                                 |  69%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================                                                                |  69%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================                                                               |  69%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================                                                               |  70%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================                                                              |  70%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================                                                             |  70%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================                                                             |  71%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================                                                            |  71%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================                                                           |  71%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================                                                           |  72%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================                                                          |  72%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================                                                         |  72%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================                                                         |  73%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================                                                        |  73%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================                                                       |  73%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================                                                       |  74%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================                                                      |  74%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================                                                     |  74%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================                                                     |  75%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================                                                    |  75%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================                                                   |  75%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================                                                   |  76%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================                                                  |  76%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================                                                 |  76%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================                                                 |  77%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================                                                |  77%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================================                                               |  77%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================================                                               |  78%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================                                              |  78%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================================                                             |  78%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================================                                             |  79%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================                                            |  79%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================                                           |  79%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================                                           |  80%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================================                                          |  80%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================                                         |  80%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================                                         |  81%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================                                        |  81%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================================                                       |  81%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================                                      |  81%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================                                      |  82%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================                                     |  82%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================                                    |  82%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================                                    |  83%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================                                   |  83%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================                                  |  83%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================                                  |  84%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================================                                 |  84%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================                                |  84%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================                                |  85%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================================================                               |  85%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================================                              |  85%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================================                              |  86%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================================================                             |  86%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================================                            |  86%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================================                            |  87%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================================                           |  87%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================================================                          |  87%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================================================                          |  88%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================================                         |  88%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================================                        |  88%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================================                        |  89%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================================================                       |  89%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================================                      |  89%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================================                      |  90%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================================                     |  90%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================================                    |  90%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================================                    |  91%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================                   |  91%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================================                  |  91%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================================                  |  92%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================================================                 |  92%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================================                |  92%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================================                |  93%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================================================================               |  93%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================================================              |  93%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================================================              |  94%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================================================================             |  94%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================================================            |  94%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================================================           |  94%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================================================           |  95%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================================================================          |  95%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================================================         |  95%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================================================         |  96%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================================================        |  96%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================================================================       |  96%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================================================================       |  97%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================================================      |  97%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================================================     |  97%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================================================     |  98%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================================================    |  98%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================================   |  98%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================================   |  99%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================================================  |  99%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================================== |  99%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================================== | 100%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                                                                                                                      
  |                                                                                                                                                                                                                |   0%
  |                                                                                                                                                                                                                      
  |============                                                                                                                                                                                                    |   6%
  |                                                                                                                                                                                                                      
  |========================                                                                                                                                                                                        |  12%
  |                                                                                                                                                                                                                      
  |=====================================                                                                                                                                                                           |  18%
  |                                                                                                                                                                                                                      
  |=================================================                                                                                                                                                               |  24%
  |                                                                                                                                                                                                                      
  |=============================================================                                                                                                                                                   |  29%
  |                                                                                                                                                                                                                      
  |=========================================================================                                                                                                                                       |  35%
  |                                                                                                                                                                                                                      
  |======================================================================================                                                                                                                          |  41%
  |                                                                                                                                                                                                                      
  |==================================================================================================                                                                                                              |  47%
  |                                                                                                                                                                                                                      
  |==============================================================================================================                                                                                                  |  53%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================                                                                                      |  59%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================                                                                         |  65%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================                                                             |  71%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================                                                 |  76%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================                                     |  82%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================================                        |  88%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================================================            |  94%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================================================| 100%

Save raw object

saveRDS(cmp.object, file = paste0(projectName, "_raw.RDS"))
cmp.object <- RunPCA(cmp.object, features = VariableFeatures(cmp.object), ndims.print = 1:5, nfeatures.print = 5)
PC_ 1 
Positive:  Vamp5, Nkg7, Car2, Apoe, Ctla2a 
Negative:  Lgals3, Aif1, Id2, Cst3, H2-Aa 
PC_ 2 
Positive:  Prtn3, Ctsg, H2afy, Mpo, Emb 
Negative:  Ube2c, Cenpf, Nusap1, Mki67, Cenpa 
PC_ 3 
Positive:  Pf4, Tmsb4x, Cavin2, Serpine2, Rap1b 
Negative:  Plac8, Cks2, Cenpa, Ube2c, Tubb4b 
PC_ 4 
Positive:  Csrp3, Car1, Jun, Apoe, Jund 
Negative:  H2afz, Hmgn2, Birc5, Hmgb1, Tuba1b 
PC_ 5 
Positive:  Pclaf, Tyms, Rrm2, Tk1, Pcna 
Negative:  Hist1h2bc, Tsc22d1, Smim14, Ccnb2, Serpinb1a 
DimPlot(cmp.object, reduction = "pca", group.by = "orig.ident")

VizDimLoadings(cmp.object, dims = 1:6, nfeatures = 10, reduction = "pca", ncol = 3)

Calculate dimensionality

ElbowPlot(cmp.object, ndims = 50)
percent.variance(cmp.object@reductions$pca@stdev)

Number of PCs describing X% of variance

ElbowPlot(cmp.object, ndims = 50)

percent.variance(cmp.object@reductions$pca@stdev)

Add cluster IDs from Seurat v1

Exported cell IDs for clusters 3, 17, 10, 11 from Seurat v1. Will add these IDs as a metadata column.
Create column “clust.ID” and populate with 0’s. Then import IDs for clusters

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
paste0("Num pcs for 80% variance:", length(which(cumsum(tot.var) <= 80)))
[1] "Num pcs for 80% variance:18"
paste0("Num pcs for 85% variance:", length(which(cumsum(tot.var) <= 85)))
[1] "Num pcs for 85% variance:25"
paste0("Num pcs for 90% variance:", length(which(cumsum(tot.var) <= 90)))
[1] "Num pcs for 90% variance:33"
paste0("Num pcs for 95% variance:", length(which(cumsum(tot.var) <= 95)))
[1] "Num pcs for 95% variance:41"

Add new metadata column

clust3.cells <- read.table(file = "../Seuratv1_clusterCellIDs/cluster3cellIDs.txt", col.names = "clust03")
clust3.cells <- sapply(clust3.cells, function(x) paste0(gsub("CMP", "CMPm2", x), "-1"))
clust17.cells <- read.table(file = "../Seuratv1_clusterCellIDs/cluster17cellIDs.txt", col.names = "clust17")
clust17.cells <- sapply(clust17.cells, function(x) paste0(gsub("CMP", "CMPm2", x), "-1"))
clust10.cells <- read.table(file = "../Seuratv1_clusterCellIDs/cluster10cellIDs.txt", col.names = "clust10")
clust10.cells <- sapply(clust10.cells, function(x) paste0(gsub("CMP", "CMPm2", x), "-1"))
clust11.cells <- read.table(file = "../Seuratv1_clusterCellIDs/cluster11cellIDs.txt", col.names = "clust11")
clust11.cells <- sapply(clust11.cells, function(x) paste0(gsub("CMP", "CMPm2", x), "-1"))

now map new ids

cmp.object@meta.data['clust.ID'] <- 0
head(cmp.object@meta.data)
Registered S3 method overwritten by 'cli':
  method     from         
  print.boxx spatstat.geom

do numbers make sense?

cmp.object@meta.data$clust.ID[rownames(cmp.object@meta.data) %in% clust3.cells] <- 3
cmp.object@meta.data$clust.ID[rownames(cmp.object@meta.data) %in% clust17.cells] <- 17
cmp.object@meta.data$clust.ID[rownames(cmp.object@meta.data) %in% clust10.cells] <- 10
cmp.object@meta.data$clust.ID[rownames(cmp.object@meta.data) %in% clust11.cells] <- 11

Total var 90%

Neighborhood and umap

set total.var <- 90%

nrow(cmp.object@meta.data[cmp.object@meta.data$clust.ID == 10,])
[1] 1049
nrow(cmp.object@meta.data[cmp.object@meta.data$clust.ID == 11,])
[1] 1118
nrow(cmp.object@meta.data[cmp.object@meta.data$clust.ID == 17,])
[1] 883
nrow(cmp.object@meta.data[cmp.object@meta.data$clust.ID == 3,])
[1] 1931

Plot UMAP

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 90))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
Computing nearest neighbor graph
Computing SNN
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8502
Number of communities: 9
Elapsed time: 1 seconds
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)
14:08:12 UMAP embedding parameters a = 0.9922 b = 1.112
14:08:12 Read 12059 rows and found 33 numeric columns
14:08:12 Using Annoy for neighbor search, n_neighbors = 30
14:08:12 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
14:08:13 Writing NN index file to temp file /var/folders/4f/fwrj6fnn1dn4g8wsf0zv563hjsvl24/T//Rtmp5gGDJN/file582a2b2d9d6c
14:08:14 Searching Annoy index using 1 thread, search_k = 3000
14:08:16 Annoy recall = 100%
14:08:17 Commencing smooth kNN distance calibration using 1 thread
14:08:17 Initializing from normalized Laplacian + noise
14:08:18 Commencing optimization for 200 epochs, with 513294 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
14:08:23 Optimization finished
for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
}
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8502
Number of communities: 9
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7974
Number of communities: 17
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7652
Number of communities: 22
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7404
Number of communities: 27
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7189
Number of communities: 30
Elapsed time: 1 seconds
saveRDS(cmp.object, file = paste0(projectName, "_dim", ndims, ".RDS"))

Clustree

what’s the max resolution we can achieve while keepign clusters stable?

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        myplot <- DimPlot(cmp.object, 
                                            group.by = meta.col,
                                            reduction = "umap", 
                                            cols = color.palette
                                            ) + 
            ggtitle(paste0(projectName, " dim", ndims, "res", gsub("RNA_snn_res", "", meta.col) ))
        plot(myplot)
    }
}

I think I’m liking res.1.0 from this. Although how much does this change if I use fewer PCs…

for each resolution, number/percentage of cells in each cluster?

plot.title <- paste0(projectName, "_clustree_ndim", max(cmp.object@commands$RunUMAP.RNA.pca$dims))
my.clustree <- clustree(cmp.object, prefix = "RNA_snn_res.", node_colour = "sc3_stability", exprs = "scale.data") + 
    scale_color_continuous(low = 'red3', high = 'white') + 
    ggtitle(plot.title)
png(filename = paste0(plot.title, ".png"), height = 800, width = 1600)
plot(my.clustree)
dev.off()
null device 
          1 

For each resolution, what percentage of cells in each cluster are enriched for one of our clust.IDs?

Test: what percentage of each new clusterID matches one of the older clusters?

tot.cells <- nrow(cmp.object@meta.data)
for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        stats.df <- data.frame(matrix(ncol = 2, nrow = length(new.clusters)))
        colnames(stats.df) <- c("num_cells", "pct_pop")
        rownames(stats.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(stats.df)){
                num.x <- nrow(meta.df[meta.df[meta.col] == row.id,])
                pct.x <- as.integer(num.x / tot.cells *100)
                # print(pct.x)
                stats.df[row.id, "num_cells"] <- num.x
                stats.df[row.id, "pct_pop"] <- pct.x
        }
        print(stats.df)
    }
}

Absolutely terrible overlap, no enrichment of any of these across the new clustering algorithm. Maybe should try 95% variation covered

Find old cells on UMAP

time for the super scarey moment to see if the cells from seuratv1 still cluster together on in seurat v4

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        enrich.df <- data.frame(matrix(ncol = 4, nrow = length(new.clusters)))
        colnames(enrich.df) <- c(3, 17, 10, 11)
        rownames(enrich.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(enrich.df)){
            tot.clus <- nrow(meta.df[meta.df[[meta.col]] == row.id,])
            for(col.id in colnames(enrich.df)){
                num.x <- nrow(meta.df[(meta.df[[meta.col]] == row.id) & (meta.df$clust.ID == col.id),])
                pct.x <- as.integer(num.x / tot.clus *100)
                # print(pct.x)
                enrich.df[row.id, col.id] <- pct.x
            }
        }
        colnames(enrich.df) <- sapply(colnames(enrich.df), function(x) paste0("oldcluster", x))
        rownames(enrich.df) <- sapply(rownames(enrich.df), function(x) paste0("newcluster", x))
        xlsx::write.xlsx(enrich.df, file = paste0("PctOfNewClustersOverlappingOldClusters_", projectName, "_dim", ndims, ".xlsx"), sheetName = paste0(gsub("RNA_snn_", "", meta.col)), append = TRUE)
        print(enrich.df)
    }
}
NA
DimPlot(cmp.object,
                reduction = "umap",
                group.by = "clust.ID", 
                # split.by = "orig.ident",
                cols = c("gray", "orange", "blue", "red", "green"),)

Total var 85%

Neighborhood and umap

set total.var <- 85%

DimPlot(cmp.object,
                reduction = "umap",
                group.by = "orig.ident", 
                split.by = "clust.ID",
                cols = c("gray", "orange", "blue", "red", "green"),)

Plot UMAP

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 85))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
Computing nearest neighbor graph
Computing SNN
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8508
Number of communities: 9
Elapsed time: 1 seconds
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)
14:14:39 UMAP embedding parameters a = 0.9922 b = 1.112
14:14:39 Read 12059 rows and found 25 numeric columns
14:14:39 Using Annoy for neighbor search, n_neighbors = 30
14:14:39 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
14:14:40 Writing NN index file to temp file /var/folders/4f/fwrj6fnn1dn4g8wsf0zv563hjsvl24/T//Rtmp5gGDJN/file582a3fba3399
14:14:40 Searching Annoy index using 1 thread, search_k = 3000
14:14:42 Annoy recall = 100%
14:14:43 Commencing smooth kNN distance calibration using 1 thread
14:14:44 Initializing from normalized Laplacian + noise
14:14:44 Commencing optimization for 200 epochs, with 500658 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
14:14:49 Optimization finished
for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
saveRDS(cmp.object, file = paste0(projectName, "_dim", ndims, ".RDS"))
}
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8508
Number of communities: 9
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8026
Number of communities: 18
Elapsed time: 2 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7700
Number of communities: 22
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7461
Number of communities: 28
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|

Clustree

what’s the max resolution we can achieve while keepign clusters stable?

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        myplot <- DimPlot(cmp.object, 
                                            group.by = meta.col,
                                            reduction = "umap", 
                                            cols = color.palette
                                            ) + 
            ggtitle(paste0(projectName, " dim", ndims, "res", gsub("RNA_snn_res", "", meta.col) ))
        plot(myplot)
    }
}

for each resolution, number/percentage of cells in each cluster?

plot.title <- paste0(projectName, "_clustree_ndim", max(cmp.object@commands$RunUMAP.RNA.pca$dims))
my.clustree <- clustree(cmp.object, prefix = "RNA_snn_res.", node_colour = "sc3_stability", exprs = "scale.data") + 
    scale_color_continuous(low = 'red3', high = 'white') + 
    ggtitle(plot.title)
png(filename = paste0(plot.title, ".png"), height = 800, width = 1600)
plot(my.clustree)
dev.off()
null device 
          1 

Identify variable genes for new biomark

length(cmp.object@assays$RNA@var.features)

Gene profiles of clusters

set ident at res = 1 and get markers

length(cmp.object@assays$RNA@var.features)
[1] 2000
Idents(cmp.object) <- "RNA_snn_res.1"
cmp.allmarkers.res1 <- FindAllMarkers(cmp.object)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~20s          
  |++                                                | 2 % ~20s          
  |++                                                | 3 % ~19s          
  |+++                                               | 4 % ~19s          
  |+++                                               | 5 % ~19s          
  |++++                                              | 6 % ~18s          
  |++++                                              | 7 % ~18s          
  |+++++                                             | 8 % ~18s          
  |+++++                                             | 9 % ~18s          
  |++++++                                            | 10% ~18s          
  |++++++                                            | 11% ~18s          
  |+++++++                                           | 12% ~17s          
  |+++++++                                           | 14% ~17s          
  |++++++++                                          | 15% ~17s          
  |++++++++                                          | 16% ~17s          
  |+++++++++                                         | 17% ~17s          
  |+++++++++                                         | 18% ~16s          
  |++++++++++                                        | 19% ~16s          
  |++++++++++                                        | 20% ~16s          
  |+++++++++++                                       | 21% ~16s          
  |+++++++++++                                       | 22% ~16s          
  |++++++++++++                                      | 23% ~16s          
  |++++++++++++                                      | 24% ~15s          
  |+++++++++++++                                     | 25% ~15s          
  |++++++++++++++                                    | 26% ~15s          
  |++++++++++++++                                    | 27% ~15s          
  |+++++++++++++++                                   | 28% ~15s          
  |+++++++++++++++                                   | 29% ~14s          
  |++++++++++++++++                                  | 30% ~14s          
  |++++++++++++++++                                  | 31% ~14s          
  |+++++++++++++++++                                 | 32% ~14s          
  |+++++++++++++++++                                 | 33% ~14s          
  |++++++++++++++++++                                | 34% ~14s          
  |++++++++++++++++++                                | 35% ~14s          
  |+++++++++++++++++++                               | 36% ~14s          
  |+++++++++++++++++++                               | 38% ~13s          
  |++++++++++++++++++++                              | 39% ~13s          
  |++++++++++++++++++++                              | 40% ~13s          
  |+++++++++++++++++++++                             | 41% ~13s          
  |+++++++++++++++++++++                             | 42% ~12s          
  |++++++++++++++++++++++                            | 43% ~12s          
  |++++++++++++++++++++++                            | 44% ~12s          
  |+++++++++++++++++++++++                           | 45% ~12s          
  |+++++++++++++++++++++++                           | 46% ~11s          
  |++++++++++++++++++++++++                          | 47% ~11s          
  |++++++++++++++++++++++++                          | 48% ~11s          
  |+++++++++++++++++++++++++                         | 49% ~11s          
  |+++++++++++++++++++++++++                         | 50% ~10s          
  |++++++++++++++++++++++++++                        | 51% ~10s          
  |+++++++++++++++++++++++++++                       | 52% ~10s          
  |+++++++++++++++++++++++++++                       | 53% ~10s          
  |++++++++++++++++++++++++++++                      | 54% ~10s          
  |++++++++++++++++++++++++++++                      | 55% ~09s          
  |+++++++++++++++++++++++++++++                     | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~09s          
  |++++++++++++++++++++++++++++++                    | 58% ~09s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |+++++++++++++++++++++++++++++++                   | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |++++++++++++++++++++++++++++++++                  | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |++++++++++++++++++++++++++++++++++                | 68% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=21s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~08s          
  |++                                                | 2 % ~07s          
  |++                                                | 3 % ~07s          
  |+++                                               | 4 % ~07s          
  |+++                                               | 5 % ~07s          
  |++++                                              | 6 % ~07s          
  |++++                                              | 7 % ~07s          
  |+++++                                             | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |++++++                                            | 10% ~07s          
  |++++++                                            | 11% ~06s          
  |+++++++                                           | 12% ~06s          
  |+++++++                                           | 13% ~06s          
  |++++++++                                          | 14% ~06s          
  |++++++++                                          | 15% ~06s          
  |+++++++++                                         | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |++++++++++                                        | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |+++++++++++                                       | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |++++++++++++                                      | 22% ~06s          
  |++++++++++++                                      | 23% ~05s          
  |+++++++++++++                                     | 24% ~05s          
  |+++++++++++++                                     | 25% ~05s          
  |++++++++++++++                                    | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |+++++++++++++++                                   | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |++++++++++++++++                                  | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |+++++++++++++++++                                 | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |++++++++++++++++++++                              | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |+++++++++++++++++++++                             | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |++++++++++++++++++++++                            | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |+++++++++++++++++++++++++                         | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=07s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~28s          
  |++                                                | 2 % ~27s          
  |++                                                | 3 % ~26s          
  |+++                                               | 4 % ~26s          
  |+++                                               | 5 % ~25s          
  |++++                                              | 6 % ~25s          
  |++++                                              | 7 % ~25s          
  |+++++                                             | 9 % ~25s          
  |+++++                                             | 10% ~26s          
  |++++++                                            | 11% ~25s          
  |++++++                                            | 12% ~25s          
  |+++++++                                           | 13% ~25s          
  |+++++++                                           | 14% ~24s          
  |++++++++                                          | 15% ~24s          
  |++++++++                                          | 16% ~23s          
  |+++++++++                                         | 17% ~23s          
  |++++++++++                                        | 18% ~23s          
  |++++++++++                                        | 19% ~22s          
  |+++++++++++                                       | 20% ~22s          
  |+++++++++++                                       | 21% ~22s          
  |++++++++++++                                      | 22% ~21s          
  |++++++++++++                                      | 23% ~21s          
  |+++++++++++++                                     | 24% ~21s          
  |+++++++++++++                                     | 26% ~20s          
  |++++++++++++++                                    | 27% ~20s          
  |++++++++++++++                                    | 28% ~20s          
  |+++++++++++++++                                   | 29% ~19s          
  |+++++++++++++++                                   | 30% ~19s          
  |++++++++++++++++                                  | 31% ~19s          
  |++++++++++++++++                                  | 32% ~18s          
  |+++++++++++++++++                                 | 33% ~18s          
  |++++++++++++++++++                                | 34% ~18s          
  |++++++++++++++++++                                | 35% ~18s          
  |+++++++++++++++++++                               | 36% ~17s          
  |+++++++++++++++++++                               | 37% ~17s          
  |++++++++++++++++++++                              | 38% ~17s          
  |++++++++++++++++++++                              | 39% ~16s          
  |+++++++++++++++++++++                             | 40% ~16s          
  |+++++++++++++++++++++                             | 41% ~16s          
  |++++++++++++++++++++++                            | 43% ~16s          
  |++++++++++++++++++++++                            | 44% ~15s          
  |+++++++++++++++++++++++                           | 45% ~15s          
  |+++++++++++++++++++++++                           | 46% ~15s          
  |++++++++++++++++++++++++                          | 47% ~14s          
  |++++++++++++++++++++++++                          | 48% ~14s          
  |+++++++++++++++++++++++++                         | 49% ~14s          
  |+++++++++++++++++++++++++                         | 50% ~13s          
  |++++++++++++++++++++++++++                        | 51% ~13s          
  |+++++++++++++++++++++++++++                       | 52% ~13s          
  |+++++++++++++++++++++++++++                       | 53% ~13s          
  |++++++++++++++++++++++++++++                      | 54% ~12s          
  |++++++++++++++++++++++++++++                      | 55% ~12s          
  |+++++++++++++++++++++++++++++                     | 56% ~12s          
  |+++++++++++++++++++++++++++++                     | 57% ~11s          
  |++++++++++++++++++++++++++++++                    | 59% ~11s          
  |++++++++++++++++++++++++++++++                    | 60% ~11s          
  |+++++++++++++++++++++++++++++++                   | 61% ~11s          
  |+++++++++++++++++++++++++++++++                   | 62% ~10s          
  |++++++++++++++++++++++++++++++++                  | 63% ~10s          
  |++++++++++++++++++++++++++++++++                  | 64% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~09s          
  |++++++++++++++++++++++++++++++++++                | 67% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~08s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~07s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~06s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=27s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~09s          
  |++                                                | 2 % ~08s          
  |++                                                | 3 % ~08s          
  |+++                                               | 4 % ~07s          
  |+++                                               | 5 % ~07s          
  |++++                                              | 6 % ~07s          
  |++++                                              | 7 % ~07s          
  |+++++                                             | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |++++++                                            | 11% ~07s          
  |++++++                                            | 12% ~07s          
  |+++++++                                           | 13% ~06s          
  |+++++++                                           | 14% ~06s          
  |++++++++                                          | 15% ~06s          
  |++++++++                                          | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |+++++++++                                         | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |++++++++++                                        | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |++++++++++++                                      | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |+++++++++++++                                     | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |++++++++++++++                                    | 26% ~05s          
  |++++++++++++++                                    | 27% ~05s          
  |+++++++++++++++                                   | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |+++++++++++++++++                                 | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |++++++++++++++++++                                | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |+++++++++++++++++++                               | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~04s          
  |++++++++++++++++++++                              | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |++++++++++++++++++++++                            | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |+++++++++++++++++++++++++                         | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |+++++++++++++++++++++++++++                       | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |++++++++++++++++++++++++++++++++                  | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |++++++++++++++++++++++++++++++++++                | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=07s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~09s          
  |++                                                | 2 % ~09s          
  |++                                                | 3 % ~09s          
  |+++                                               | 5 % ~09s          
  |+++                                               | 6 % ~08s          
  |++++                                              | 7 % ~08s          
  |+++++                                             | 8 % ~10s          
  |+++++                                             | 9 % ~10s          
  |++++++                                            | 10% ~10s          
  |++++++                                            | 11% ~09s          
  |+++++++                                           | 13% ~09s          
  |+++++++                                           | 14% ~09s          
  |++++++++                                          | 15% ~09s          
  |+++++++++                                         | 16% ~09s          
  |+++++++++                                         | 17% ~08s          
  |++++++++++                                        | 18% ~08s          
  |++++++++++                                        | 20% ~08s          
  |+++++++++++                                       | 21% ~08s          
  |+++++++++++                                       | 22% ~08s          
  |++++++++++++                                      | 23% ~08s          
  |+++++++++++++                                     | 24% ~08s          
  |+++++++++++++                                     | 25% ~07s          
  |++++++++++++++                                    | 26% ~07s          
  |++++++++++++++                                    | 28% ~07s          

Find top.var genes in cmp.top100markers.res1

cmp.top100markers.res1 <- cmp.allmarkers.res1 %>% group_by(cluster) %>% top_n(n = 100, wt = abs(avg_log2FC))
cmp.top100markers.res1 <- cmp.top100markers.res1[cmp.top100markers.res1$p_val_adj <= 0.05, ]
for(cluster in unique(cmp.top100markers.res1$cluster)){
    num.hits <- nrow(cmp.top100markers.res1[cmp.top100markers.res1$cluster == cluster, ])
    print(paste("cluster", cluster, "has", num.hits, "genes"))
}
[1] "cluster 0 has 99 genes"
[1] "cluster 1 has 99 genes"
[1] "cluster 2 has 99 genes"
[1] "cluster 3 has 99 genes"
[1] "cluster 4 has 97 genes"
[1] "cluster 5 has 98 genes"
[1] "cluster 6 has 98 genes"
[1] "cluster 7 has 96 genes"
[1] "cluster 8 has 99 genes"
[1] "cluster 9 has 97 genes"
[1] "cluster 10 has 100 genes"
[1] "cluster 11 has 98 genes"
[1] "cluster 12 has 97 genes"
[1] "cluster 13 has 99 genes"
[1] "cluster 14 has 2 genes"
[1] "cluster 15 has 98 genes"
[1] "cluster 16 has 98 genes"
[1] "cluster 17 has 96 genes"

For each resolution, what percentage of cells in each cluster are enriched for one of our clust.IDs?

Test: what percentage of each new clusterID matches one of the older clusters?

top.var <- cmp.object@assays$RNA@var.features[1:150]
# top.var
n.vargenes <- c()
for(gene in top.var){
    if(gene %in% cmp.top100markers.res1$gene){
        n.vargenes <- c(n.vargenes, gene)
    }
}
print(length(n.vargenes))
[1] 105
top.var[!(top.var %in% n.vargenes)]
 [1] "Ccl5"          "Hspa1a"        "Ppbp"          "Gm26737"       "Olfr1369-ps1"  "Ms4a3"         "Ly6d"          "Gm26885"       "Olfr655"       "Ifit1"         "Trbc1"         "Lgi1"         
[13] "Mt2"           "Cd209a"        "Dqx1"          "Retn"          "Prss34"        "S100a8"        "Txndc16"       "Gm17657"       "B3galt2"       "Tcf7"          "Wnt2b"         "Trbc2"        
[25] "S100a9"        "Xlr"           "Ccl6"          "S100a2"        "Tc2n"          "Clec1b"        "Trp53inp2"     "Gm42418"       "Isg15"         "Ly6k"          "Gm50255"       "Gm27252"      
[37] "Chil3"         "Iigp1"         "Cxcl2"         "Rsad2"         "Hoga1"         "Rpl39l"        "B230312C02Rik" "Xcr1"          "Rtp4"         

Absolutely terrible overlap, no enrichment of any of these across the new clustering algorithm. Maybe should try 95% variation covered

Find old cells on UMAP

time for the super scarey moment to see if the cells from seuratv1 still cluster together on in seurat v4

DimPlot(cmp.object,
                reduction = "umap",
                group.by = "clust.ID", 
                # split.by = "orig.ident",
                cols = c("gray", "orange", "blue", "red", "green"),)
DimPlot(cmp.object,
                reduction = "umap",
                group.by = "orig.ident", 
                split.by = "clust.ID",
                cols = c("gray", "orange", "blue", "red", "green"),)

Total var 80%

Neighborhood and umap

set total.var <- 80%

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 80))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)

Plot UMAP

for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
saveRDS(cmp.object, file = paste0(projectName, "_dim", ndims, ".RDS"))
}
for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        myplot <- DimPlot(cmp.object, 
                                            group.by = meta.col,
                                            reduction = "umap", 
                                            cols = color.palette
                                            ) + 
            ggtitle(paste0(projectName, " dim", ndims, "res", gsub("RNA_snn_res", "", meta.col) ))
        plot(myplot)
    }
}

Clustree

what’s the max resolution we can achieve while keepign clusters stable?

plot.title <- paste0(projectName, "_clustree_ndim", max(cmp.object@commands$RunUMAP.RNA.pca$dims))
my.clustree <- clustree(cmp.object, prefix = "RNA_snn_res.", node_colour = "sc3_stability", exprs = "scale.data") + 
    scale_color_continuous(low = 'red3', high = 'white') + 
    ggtitle(plot.title)
png(filename = paste0(plot.title, ".png"), height = 800, width = 1600)
plot(my.clustree)
dev.off()

for each resolution, number/percentage of cells in each cluster?

tot.cells <- nrow(cmp.object@meta.data)
for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        stats.df <- data.frame(matrix(ncol = 2, nrow = length(new.clusters)))
        colnames(stats.df) <- c("num_cells", "pct_pop")
        rownames(stats.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(stats.df)){
                num.x <- nrow(meta.df[meta.df[meta.col] == row.id,])
                pct.x <- as.integer(num.x / tot.cells *100)
                # print(pct.x)
                stats.df[row.id, "num_cells"] <- num.x
                stats.df[row.id, "pct_pop"] <- pct.x
        }
        print(stats.df)
    }
}

For each resolution, what percentage of cells in each cluster are enriched for one of our clust.IDs?

Test: what percentage of each new clusterID matches one of the older clusters?

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        enrich.df <- data.frame(matrix(ncol = 4, nrow = length(new.clusters)))
        colnames(enrich.df) <- c(3, 17, 10, 11)
        rownames(enrich.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(enrich.df)){
            tot.clus <- nrow(meta.df[meta.df[[meta.col]] == row.id,])
            for(col.id in colnames(enrich.df)){
                num.x <- nrow(meta.df[(meta.df[[meta.col]] == row.id) & (meta.df$clust.ID == col.id),])
                pct.x <- as.integer(num.x / tot.clus *100)
                # print(pct.x)
                enrich.df[row.id, col.id] <- pct.x
            }
        }
        colnames(enrich.df) <- sapply(colnames(enrich.df), function(x) paste0("oldcluster", x))
        rownames(enrich.df) <- sapply(rownames(enrich.df), function(x) paste0("newcluster", x))
        xlsx::write.xlsx(enrich.df, file = paste0("PctOfNewClustersOverlappingOldClusters_", projectName, "_dim", ndims, ".xlsx"), sheetName = paste0(gsub("RNA_snn_", "", meta.col)), append = TRUE)
        print(enrich.df)
    }
}

Absolutely terrible overlap, no enrichment of any of these across the new clustering algorithm. Maybe should try 95% variation covered

Find old cells on UMAP

time for the super scarey moment to see if the cells from seuratv1 still cluster together on in seurat v4

DimPlot(cmp.object,
                reduction = "umap",
                group.by = "clust.ID", 
                # split.by = "orig.ident",
                cols = c("gray", "orange", "blue", "red", "green"),)
DimPlot(cmp.object,
                reduction = "umap",
                group.by = "orig.ident", 
                split.by = "clust.ID",
                cols = c("gray", "orange", "blue", "red", "green"),)

Total var 95%

Neighborhood and umap

set total.var <- 95%

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 95))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)

Plot UMAP

for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
}
saveRDS(cmp.object, file = paste0(projectName, "_dim", ndims, ".RDS"))
cmp.object <- readRDS("CMP_dim41.RDS")
plot.title <- paste0(projectName, "_clustree_ndim", max(cmp.object@commands$RunUMAP.RNA.pca$dims))
my.clustree <- clustree(cmp.object, prefix = "RNA_snn_res.", node_colour = "sc3_stability", exprs = "scale.data") + 
    scale_color_continuous(low = 'red3', high = 'white') + 
    ggtitle(plot.title)
png(filename = paste0(plot.title, ".png"), height = 800, width = 1600)
plot(my.clustree)
dev.off()

For each resolution, what percentage of cells in each cluster are enriched for one of our clust.IDs?

Test: what percentage of each new clusterID matches one of the older clusters?

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        enrich.df <- data.frame(matrix(ncol = 4, nrow = length(new.clusters)))
        colnames(enrich.df) <- c(3, 17, 10, 11)
        rownames(enrich.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(enrich.df)){
            tot.clus <- nrow(meta.df[meta.df[[meta.col]] == row.id,])
            for(col.id in colnames(enrich.df)){
                num.x <- nrow(meta.df[(meta.df[[meta.col]] == row.id) & (meta.df$clust.ID == col.id),])
                pct.x <- as.integer(num.x / tot.clus *100)
                # print(pct.x)
                enrich.df[row.id, col.id] <- pct.x
            }
        }
        colnames(enrich.df) <- sapply(colnames(enrich.df), function(x) paste0("oldcluster", x))
        rownames(enrich.df) <- sapply(rownames(enrich.df), function(x) paste0("newcluster", x))
        xlsx::write.xlsx(enrich.df, file = paste0("PctOfNewClustersOverlappingOldClusters_", projectName, "_dim", ndims, ".xlsx"), sheetName = paste0(gsub("RNA_snn_", "", meta.col)), append = TRUE)
        print(enrich.df)
    }
}

Absolutely terrible overlap, no enrichment of any of these across the new clustering algorithm. Maybe should try 95% variation covered

Find old cells on UMAP

time for the super scarey moment to see if the cells from seuratv1 still cluster together on in seurat v4

DimPlot(cmp.object,
                reduction = "umap",
                group.by = "clust.ID", 
                pt.size = .1,
                # split.by = "orig.ident",
                cols = c("gray", "orange", "blue", "red", "green"),)
DimPlot(cmp.object,
                reduction = "umap",
                group.by = "orig.ident", 
                split.by = "clust.ID",
                cols = c("gray", "orange", "blue", "red", "green"),)

Gene expression of old clustrs on new map

Let’s see if we can get some gene expression profiles on these…

gene.list <- c("Gata1", "Gata2", "Pf4", "Dntt", "Mpo", "Meis1", "Irf8", "Elane", "Fli1", "Zfpm1")
VlnPlot(cmp.object, features = gene.list, group.by = "clust.ID", pt.size = 0.01, cols = c("gray", "orange", "blue", "red", "green"))

Used the exce doc to do some fancy conditional formatting. Old cluster 17 is pretty dispersed until you it resolution 2.5. Otherise, cells in old cluster 17 do not constitute more than 40% of any cells in the new clusters.
As far as I can see, the two approaches are to do DGEof new CMP w/ resolution = 2.5, AND/OR do DGe using older cluster IDs. Sure seems to make sense to do both…

DGE w/ resolution = 2.5

Strt with comparing all clusters against all other clusters Write out cluster info

calculate FindAllMarkers() for different idents and save to new file

ident.list <- c("RNA_snn_res.0.5", "RNA_snn_res.1", "RNA_snn_res.1.5", "RNA_snn_res.2", "RNA_snn_res.2.5", "clust.ID")
for(tested.ident in ident.list){
    Idents(cmp.object) <- tested.ident
    all.markers <- FindAllMarkers(cmp.object)
    xlsx::write.xlsx(x = all.markers[,c("avg_log2FC", "p_val_adj", "cluster", "gene")], 
                                     file = paste0(projectName, "_FindALLMarkers_res2.5.xlsx"), 
                                     sheetName = tested.ident, 
                                     col.names = TRUE, 
                                     row.names = FALSE, 
                                     append = TRUE)
}

Create FindAllMarkers() lists for GSEA

Idents(cmp.object) <- "RNA_snn_res.2.5"
res.2.5.allmarkers <- FindAllMarkers(cmp.object)

Map HGNC symbols

Mouse2HumanTable <- Mouse2Human(res.2.5.allmarkers$gene)

HGNC <- with(Mouse2HumanTable, Mouse2HumanTable$HGNC[match(res.2.5.allmarkers$gene, Mouse2HumanTable$MGI)])
head(res.2.5.allmarkers)
res.2.5.allmarkers$HGNC <- HGNC
tail(res.2.5.allmarkers)
sig.res.2.5 <- res.2.5.allmarkers[res.2.5.allmarkers$p_val_adj <= 0.05, ]
sig.res.2.5 <- sig.res.2.5[c("avg_log2FC", "HGNC", "cluster")]
sig.res.2.5 <- sig.res.2.5[!(sig.res.2.5$HGNC == "" | is.na(sig.res.2.5$HGNC)),] # GSEA will fail if there are any blanks or NAs in the table
sig.res.2.5 <- sig.res.2.5[]
for(cluster in unique(sig.res.2.5$cluster)){
    print(paste("writing cluster", cluster))
    new.table <- sig.res.2.5[sig.res.2.5$cluster == cluster, c("HGNC", "avg_log2FC")]
    new.table <- new.table[order(-new.table$avg_log2FC), ]
    write.table(new.table, file = paste0("RankList_res2.5_findAll_hgnc/res.2.5cluster", cluster, ".rnk"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = "\t", )
    
}

calculate FindMarkers() that distinguish each cluster (might overlab between clusters)

ident.list <- c("RNA_snn_res.0.5", "RNA_snn_res.1", "RNA_snn_res.1.5", "RNA_snn_res.2", "RNA_snn_res.2.5", "clust.ID")
for(tested.ident in ident.list){
    object.copy <- cmp.object
    Idents(object.copy) <- tested.ident
    print(paste("testing", tested.ident))
    for (cluster in sort(as.numeric(levels(object.copy@meta.data[[tested.ident]])))){
        print(paste("looking at cluster", cluster))
        cluster.markers <- FindMarkers(object.copy, ident.1 = cluster)
        try(
            xlsx::write.xlsx(x = cluster.markers[,c("avg_log2FC", "p_val_adj")], 
                                             file = paste0(projectName, "_FindMarkers_", gsub("RNA_snn_", "", tested.ident), ".xlsx"), 
                                             sheetName = paste0("clst", cluster), 
                                             col.names = TRUE, 
                                             row.names = TRUE, 
                                             append = TRUE)
        )   
    }
    remove(object.copy)
}
for (cluster in sort(as.numeric(levels(cmp.object@meta.data$RNA_snn_res.2.5)))){
    cluster.markers <- FindMarkers(cmp.object, ident.1 = cluster)
    xlsx::write.xlsx(x = cluster.markers[,c("avg_log2FC", "p_val_adj")], 
                                     file = paste0(projectName, "_FindMarkers_res2.5.xlsx"), 
                                     sheetName = paste0("clst", cluster), 
                                     col.names = TRUE, 
                                     row.names = TRUE, 
                                     append = TRUE)
}

Combine clusters that might represent old cluster ids

DGE w/ metadata against clust.ID against “0”

reset ident as “clust.ID” and rerun FindAllMarkers()

    Idents(cmp.object) <- "clust.ID"
    all.markers <- FindAllMarkers(cmp.object)
    xlsx::write.xlsx(x = all.markers[,c("avg_log2FC", "p_val_adj", "cluster", "gene")], 
                                     file = paste0(projectName, "_FindALLMarkers_clustID.xlsx"), 
                                     sheetName = "clustID", 
                                     col.names = TRUE, 
                                     row.names = FALSE, 
                                     append = TRUE)
# Idents(cmp.object) <- "clust.ID"
for (cluster in unique(cmp.object@meta.data$clust.ID)){
    print(cluster)
    cluster.markers <- FindMarkers(cmp.object, ident.1 = cluster)
    xlsx::write.xlsx(x = cluster.markers[,c("avg_log2FC", "p_val_adj")], 
                                     file = paste0(projectName, "_FindMarkers_clustID.xlsx"), 
                                     sheetName = paste0("oldclust", cluster), 
                                     col.names = TRUE, 
                                     row.names = TRUE, 
                                     append = TRUE)
}

Distinguishing features of clusters

Previously defined biomark genes based on PC contributions. Original list was based on all msAggr, but let’s see how CMP subset does?

VizDimLoadings(cmp.object, dims = 1:10, nfeatures = 30, reduction = "pca", ncol = 2)
pca.df <- cmp.object[["pca"]]
pca.df <- as.data.frame(as.matrix(slot(object = pca.df, name = "feature.loadings")))
print(cmp.object[["pca"]], dims = 2, nfeatures = 5)
rownames(pca.df[pca.df$PC_2 %in% sort(pca.df$PC_2, decreasing = TRUE)[1:5], ])
rownames(pca.df[pca.df$PC_2 %in% sort(pca.df$PC_2)[1:5], ])

now we can get a list of principal components!
first pull the list of oldAnalysis CMP top PC genes

cmp.biomark <- read.table(file = "/Users/heustonef/Desktop/CMPSubpops/BioMark/ProbePanels/CMP_PCTopGenes.txt", sep = "\t", header = TRUE)
biomark.cmptargets <- c()
for(df.col in 1:ncol(cmp.biomark)){
    biomark.cmptargets <- c(biomark.cmptargets, biomark[,df.col])
}
print(colnames(biomark))
print(paste("total gene count:", length(biomark.cmptargets)))

Now get the list of current pc gene trgets (oldAnalysis used ndim = 1:6, so we’ll start with that range)

pc.list <- c("PC_1", "PC_2", "PC_3", "PC_4", "PC_5", "PC_6")
pc.genes <- lapply(pc.list, function(x) rownames(pca.df[pca.df[[x]] %in% sort(pca.df[[x]], decreasing = TRUE)[1:30],])) #targeting roughly 180 genes like in biomark.cmptargets
pc.genes <- unique(unlist(pc.genes))
print(paste("total gene count:", length(pc.genes)))

Now compare the lists, I guess:

# setdiff(x,y) gives you things in x not in y. setdiff(y,x) gives you things in y not in x
setdiff(biomark.cmptargets, pc.genes)
# print(paste("\n length:", length(setdiff(biomark.cmptargets, pc.genes))))
writeLines(c("", "length:", length(setdiff(biomark.cmptargets, pc.genes))))

Umm, yeah that went kinda how I expected. Let’s do this again, but for the actual biomark gene lists.

biomark <- read.table(file = "/Users/heustonef/Desktop/CMPSubpops/BioMark/ProbePanels/BiomarkProbeList.txt", sep = "\t")
biomark <- biomark[,1]
setdiff(biomark, pc.genes)
writeLines(c("", "length:", length(setdiff(biomark, pc.genes))))

What if we increase the number of pcs but decrease the depth of each? This might cover more of biomark, which was originally developed using msAggr instead of only the CMP subset

pc.list <- c("PC_1", "PC_2", "PC_3", "PC_4", "PC_5", "PC_6", "PC_7", "PC_8", "PC_9", "PC_10")
pc.genes <- lapply(pc.list, function(x) rownames(pca.df[pca.df[[x]] %in% sort(pca.df[[x]], decreasing = TRUE)[1:20],]))
pc.genes <- unique(unlist(pc.genes))
print(paste("total gene count:", length(pc.genes)))
setdiff(biomark, pc.genes)
writeLines(c("", "length:", length(setdiff(biomark, pc.genes))))

For comparison, let’s just see how many of biomark.cmptargets were actually included in biomark

setdiff(biomark.cmptargets, biomark)
writeLines(c("", "length:", length(setdiff(biomark.cmptargets, pc.genes))))
length(biomark) - length(setdiff(biomark, biomark.cmptargets))
length(biomark) - length(setdiff(biomark, pc.genes))

So when you look at it like that, it’s not actually that far off.

What are the similarities?:

setdiff(setdiff(biomark, biomark.cmptargets), setdiff(biomark, pc.genes))

These are genes from the 97probes not in the old CMP set that are also not in the new CMP set. Other than Itga2b (which is a failed probe anyway), nothing screams. Also we’d have thrown Flt3 and Cd34 for in anyway because they’re requisite cell surface markers (also Flt3 surface marker is expensive but otherwise not noteworthy and not used in the current sorting strategy)

What about cell surface marker expression? * Cd34 * Cd16/32 * Cd9 * Cd41 * Cd48 * Sca1 (just throw that in for sh*&s and giggles)

surface.markers <- c("Cd34", "Fcgr3", "Fcgr2b", "Cd9", "Itga2b", "Cd48", "Ly6a")
FeaturePlot(cmp.object, features = surface.markers, pt.size = 1, split.by = "clust.ID", ncol = 1)

Save as png

png(filename = "FeaturePlot_CMP_surfaceMarkers_clustIDfacet.png", height = 1600, width = 1600)
FeaturePlot(cmp.object, features = surface.markers, pt.size = 1, split.by = "clust.ID", ncol = 1)
dev.off()

Compare @g hierarchcial clusteirng

Do clustering using biomark RNAs as input

# Read in BiomarkRNAs
biomark.rnas <- read.table('/Users/heustonef/Desktop/10XGenomicsData/BiomarkRNAs.txt')
biomark.rnas <- biomark.rnas$V1

use biomark RNAs to define dimensional reduction

cmp.object <- readRDS("CMP_raw.RDS")
cmp.object <- RunPCA(cmp.object, features = biomark.rnas, ndims.print = 1:5, , nfeatures.print = 5)
ElbowPlot(cmp.object, ndims = 50)

Now run the clustering

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 90))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)

find the clusters

for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
}

Plot the umaps and cell cluster ids

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        myplot <- DimPlot(cmp.object, 
                                            group.by = meta.col,
                                            reduction = "umap", 
                                            cols = color.palette
                                            ) + 
            ggtitle(paste0(projectName, " dim", ndims, "res", gsub("RNA_snn_res", "", meta.col) ))
        plot(myplot)
    }
}

Calculate anticipated number of cells you’ll find in each biomark cluster

Get # cells in each cluster

tot.cellcount <- nrow(cmp.object@meta.data)
res05.list <- sort(unique(cmp.object@meta.data$RNA_snn_res.0.5), decreasing = FALSE)
sapply(res05.list, 
             function(x){
                print(
                    paste(
                        "cluster", x, "=", 
                        nrow(cmp.object@meta.data[cmp.object@meta.data$RNA_snn_res.0.5 == x,]), 
                        "cells or", 
                        round(nrow(cmp.object@meta.data[cmp.object@meta.data$RNA_snn_res.0.5 == x,])/tot.cellcount*100, digits = 2), 
                        "% of total"
                    )
                )
             }
            )

So we did the dimensional reduction based on the biomark RNAs, then did our UMAP nearest neighbor clustering.

In the biomark hierarchcial clustering analysis I assayed 167 cells. The smallest cluster I detected had 3 cells, or 1.8% of total, and this is an uncomfortably small number of cells. Based on the UMAP calculations I would therefore expect to find 11 or 12 of the predicted 15 clusters. I found 12, and I don’t really like that last one, so 11 or 12. Since I did the hierarchcial clustering yesterday and did this math today, we can say it was independent of these results and therefore totally legit. Yay!!

LS0tCnRpdGxlOiAiQ01QU3Vic2V0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIFVwZGF0ZXMKCiMjIFVwZGF0ZSAyMDIxLjA4LjExCk1vc3QgdGhvcm91Z2ggd2F5IHRvIHJlYWRkcmVzcyBkaWZmZXJlbmNlcyBiZXR3ZWVuIG9yaWdpbmFsIGFuZCBjdXJyZW50IGFuYWx5c2VzIGlzIHRvIGpzdXQgcmVkbyB0aGUgYmlvbWFyay4gVG8gdGhhdCBlbmQsIHdpbGwgcmVzdGFydCBhbmFseXNpcyBvZiAqanVzdCogQ01QbTIsIGV4Y2x1ZGluZyBvdGhlciBkYXRhc2V0cyAoaS5lLiwgTFNLLCBNRVAsIEdNUCkuIFdpbGwgYWxzbyBrZWVwIAoKCiMgTm90ZWJvb2sgc2V0dXAKCkNyZWF0aW5nIG5ldyBwaXBlbGluZSB1c2luZyBzZXVyYXQgdjQuMC4yIGF2YWlsYWJsZSAyMDIxLjA2LjA4CgpMb2FkIGxpYnJhcmllcyByZXF1aXJlZCBmb3IgU2V1cmF0djQKCmBgYHtyIHNldHVwfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShjbHVzdHJlZSkKYGBgCgojIFNldCBnbG9iYWwgdmFyaWFibGVzCmBgYHtyfQpwcm9qZWN0TmFtZSA8LSAiQ01QIgpqYWNrc3RyYXcuZGltIDwtIDQwCmBgYAoKc3RvcmUgc2Vzc2lvbiBpbmZvCmBgYHtyfQpzZXNzaW9uSW5mby5maWxlbmFtZSA8LSBwYXN0ZTAocHJvamVjdE5hbWUsICJfc2Vzc2lvbkluZm8udHh0IikKc2luayhzZXNzaW9uSW5mby5maWxlbmFtZSkKc2Vzc2lvbkluZm8oKQpzaW5rKCkKYGBgCgoKYGBge3J9CnNvdXJjZSgiLi4vUkZ1bmN0aW9ucy9yZWFkXzEwWEdlbm9taWNzX2RhdGEuUiIpCnNvdXJjZSgiLi4vUkZ1bmN0aW9ucy9QZXJjZW50VmFyaWFuY2UuUiIpCnNvdXJjZSgiLi4vUkZ1bmN0aW9ucy9Nb3VzZTJIdW1hbl9pZGNvbnZlcnNpb24uUiIpCnNvdXJjZSAoIi4uL1JGdW5jdGlvbnMvQ29sb3JQYWxldHRlLlIiKQpgYGAKCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpzZXR3ZCgiLi4vLi4vY2VsbFJhbmdlci8iKSAjIHRlbXBvcmFyaWx5IGNoYW5naW5nIHdkIG9ubHkgd29ya3MgaWYgeW91IHJ1biB0aGUgZW50aXJlIGNodW5rIGF0IG9uY2UKZGF0YV9maWxlLmxpc3QgPC0gcmVhZF8xMFhHZW5vbWljc19kYXRhKHNhbXBsZS5saXN0ID0gIkNNUG0yIikKb2JqZWN0LmRhdGEgPC1SZWFkMTBYKGRhdGFfZmlsZS5saXN0KQpgYGAKCgoKYGBge3J9CmNtcC5vYmplY3Q8LSBDcmVhdGVTZXVyYXRPYmplY3QoY291bnRzID0gb2JqZWN0LmRhdGEsIG1pbi5jZWxscyA9IDMsIG1pbi5nZW5lcyA9IDIwMCwgcHJvamVjdCA9IHByb2plY3ROYW1lKQpgYGAKCkNsZWFuIHVwIHRvIGZyZWUgbWVtb3J5CgpgYGB7cn0KcmVtb3ZlKG9iamVjdC5kYXRhKQpgYGAKCgpBZGQgbWl0b2Nob25kcmlhbCBtZXRhZGF0YSBhbmQgcGxvdCBzb21lIGJhc2ljIGZlYXR1cmVzCmBgYHtyfQpjbXAub2JqZWN0W1sicGVyY2VudC5tdCJdXSA8LSBQZXJjZW50YWdlRmVhdHVyZVNldChjbXAub2JqZWN0LCBwYXR0ZXJuID0gIl5tdC0iKQpWbG5QbG90KGNtcC5vYmplY3QsIGZlYXR1cmVzID0gYygibkZlYXR1cmVfUk5BIiwgIm5Db3VudF9STkEiLCAicGVyY2VudC5tdCIpLCBuY29sID0gMywgcHQuc2l6ZSA9IDAsIGZpbGwuYnkgPSAnb3JpZy5pZGVudCcsICkKYGBgCgoKYGBge3J9CnBsb3QxIDwtIEZlYXR1cmVTY2F0dGVyKGNtcC5vYmplY3QsIGZlYXR1cmUxID0gIm5Db3VudF9STkEiLCBmZWF0dXJlMiA9ICJwZXJjZW50Lm10IiwgZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIsIHB0LnNpemUgPSAwLjAxKQpwbG90MiA8LSBGZWF0dXJlU2NhdHRlcihjbXAub2JqZWN0LCBmZWF0dXJlMSA9ICJuQ291bnRfUk5BIiwgZmVhdHVyZTIgPSAibkZlYXR1cmVfUk5BIiwgZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIsIHB0LnNpemUgPSAwLjAxKQpwbG90MSArIHBsb3QyCmBgYAojIyBGaWx0ZXIgZGF0YQpyZW1vdmUgbG93IHF1YWxpdHkgY2VsbHMKcmVxdWlyZTogbkZlYXR1cmVfUk5BIGJldHdlZW4gMjAwIGFuZCA0MDAwIChpbmNsdXNpdmUpCnJlcXVpcmU6IHBlcmNlbnQubXQgPD01CgpgYGB7cn0KcHJpbnQocGFzdGUoIm9yaWdpbmFsIG9iamVjdDoiLCBucm93KGNtcC5vYmplY3RAbWV0YS5kYXRhKSwgImNlbGxzIiwgc2VwID0gIiAiKSkKY21wLm9iamVjdCA8LSBzdWJzZXQoY21wLm9iamVjdCwgCgkJCQkJCQkJCQkJCXN1YnNldCA9IG5GZWF0dXJlX1JOQSA+PTIwMCAmIAoJCQkJCQkJCQkJCQkJbkZlYXR1cmVfUk5BIDw9IDQwMDAgJiAKCQkJCQkJCQkJCQkJCXBlcmNlbnQubXQgPD0gNQoJCQkJCQkJCQkJCQkpCnByaW50KHBhc3RlKCJuZXcgb2JqZWN0OiIsIG5yb3coY21wLm9iamVjdEBtZXRhLmRhdGEpLCAiY2VsbHMiLCBzZXAgPSAiICIpKQpgYGAKCgoKYGBge3J9CmNtcC5vYmplY3QgPC0gTm9ybWFsaXplRGF0YShjbXAub2JqZWN0LCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJMb2dOb3JtYWxpemUiLCBzY2FsZS5mYWN0b3IgPSAxMDAwMCkKYGBgCgoKRmluZCB2YXJpYWJsZSBmZWF0dXJlcwpgYGB7ciBmaWcud2lkdGggPSA1LCBmaWcuaGVpZ2h0ID0gMn0KY21wLm9iamVjdCA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhjbXAub2JqZWN0LCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCnRvcDEwIDwtIGhlYWQoVmFyaWFibGVGZWF0dXJlcyhjbXAub2JqZWN0KSwgMTApCnBsb3QxIDwtIFZhcmlhYmxlRmVhdHVyZVBsb3QoY21wLm9iamVjdCkKcGxvdDIgPC0gTGFiZWxQb2ludHMocGxvdCA9IHBsb3QxLCBwb2ludHMgPSB0b3AxMCwgcmVwZWwgPSBUUlVFKQpwbG90MSArIHBsb3QyCmBgYAoKIyMgU2NhbGUgZGF0YSAobGluZWFyIHRyYW5zZm9ybWF0aW9uKQpXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGNvbXBhcmluZyBsaWJyYXJ5IGRlcHRocywgc28gd2UnbGwganVzdCBkbyBub3JtYWxpemF0aW9uL1NjYWxlIGRhdGEKCmBgYHtyIGVjaG8gPSBGQUxTRX0KYWxsLmdlbmVzIDwtIHJvd25hbWVzKGNtcC5vYmplY3QpCmNtcC5vYmplY3QgPC0gU2NhbGVEYXRhKGNtcC5vYmplY3QsIGZlYXR1cmVzID0gYWxsLmdlbmVzLCB2YXJzLnRvLnJlZ3Jlc3MgPSBjKCJuRmVhdHVyZV9STkEiLCAibkNvdW50X1JOQSIpKQpgYGAKCiMjIFNhdmUgcmF3IG9iamVjdApgYGB7cn0Kc2F2ZVJEUyhjbXAub2JqZWN0LCBmaWxlID0gcGFzdGUwKHByb2plY3ROYW1lLCAiX3Jhdy5SRFMiKSkKYGBgCgoKCmBgYHtyfQpjbXAub2JqZWN0IDwtIFJ1blBDQShjbXAub2JqZWN0LCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoY21wLm9iamVjdCksIG5kaW1zLnByaW50ID0gMTo1LCBuZmVhdHVyZXMucHJpbnQgPSA1KQpgYGAKCmBgYHtyfQpEaW1QbG90KGNtcC5vYmplY3QsIHJlZHVjdGlvbiA9ICJwY2EiLCBncm91cC5ieSA9ICJvcmlnLmlkZW50IikKVml6RGltTG9hZGluZ3MoY21wLm9iamVjdCwgZGltcyA9IDE6NiwgbmZlYXR1cmVzID0gMTAsIHJlZHVjdGlvbiA9ICJwY2EiLCBuY29sID0gMykKCmBgYAoKQ2FsY3VsYXRlIGRpbWVuc2lvbmFsaXR5CmBgYHtyLCBmaWd1cmVzLXNpZGUsIGZpZy5zaG93PSdob2xkJywgb3V0LndpZHRoPSI1MCUifQpFbGJvd1Bsb3QoY21wLm9iamVjdCwgbmRpbXMgPSA1MCkKcGVyY2VudC52YXJpYW5jZShjbXAub2JqZWN0QHJlZHVjdGlvbnMkcGNhQHN0ZGV2KQpgYGAKTnVtYmVyIG9mIFBDcyBkZXNjcmliaW5nIFglIG9mIHZhcmlhbmNlCgpgYGB7cn0KdG90LnZhciA8LSBwZXJjZW50LnZhcmlhbmNlKGNtcC5vYmplY3RAcmVkdWN0aW9ucyRwY2FAc3RkZXYsIHBsb3QudmFyID0gRkFMU0UsIHJldHVybi52YWwgPSBUUlVFKQpwYXN0ZTAoIk51bSBwY3MgZm9yIDgwJSB2YXJpYW5jZToiLCBsZW5ndGgod2hpY2goY3Vtc3VtKHRvdC52YXIpIDw9IDgwKSkpCnBhc3RlMCgiTnVtIHBjcyBmb3IgODUlIHZhcmlhbmNlOiIsIGxlbmd0aCh3aGljaChjdW1zdW0odG90LnZhcikgPD0gODUpKSkKcGFzdGUwKCJOdW0gcGNzIGZvciA5MCUgdmFyaWFuY2U6IiwgbGVuZ3RoKHdoaWNoKGN1bXN1bSh0b3QudmFyKSA8PSA5MCkpKQpwYXN0ZTAoIk51bSBwY3MgZm9yIDk1JSB2YXJpYW5jZToiLCBsZW5ndGgod2hpY2goY3Vtc3VtKHRvdC52YXIpIDw9IDk1KSkpCgpgYGAKCiMgQWRkIGNsdXN0ZXIgSURzIGZyb20gU2V1cmF0IHYxCgpFeHBvcnRlZCBjZWxsIElEcyBmb3IgY2x1c3RlcnMgMywgMTcsIDEwLCAxMSBmcm9tIFNldXJhdCB2MS4gV2lsbCBhZGQgdGhlc2UgSURzIGFzIGEgbWV0YWRhdGEgY29sdW1uLiAgCkNyZWF0ZSBjb2x1bW4gImNsdXN0LklEIiBhbmQgcG9wdWxhdGUgd2l0aCAwJ3MuIFRoZW4gaW1wb3J0IElEcyBmb3IgY2x1c3RlcnMKCgoKYGBge3J9CmNsdXN0My5jZWxscyA8LSByZWFkLnRhYmxlKGZpbGUgPSAiLi4vU2V1cmF0djFfY2x1c3RlckNlbGxJRHMvY2x1c3RlcjNjZWxsSURzLnR4dCIsIGNvbC5uYW1lcyA9ICJjbHVzdDAzIikKY2x1c3QzLmNlbGxzIDwtIHNhcHBseShjbHVzdDMuY2VsbHMsIGZ1bmN0aW9uKHgpIHBhc3RlMChnc3ViKCJDTVAiLCAiQ01QbTIiLCB4KSwgIi0xIikpCmNsdXN0MTcuY2VsbHMgPC0gcmVhZC50YWJsZShmaWxlID0gIi4uL1NldXJhdHYxX2NsdXN0ZXJDZWxsSURzL2NsdXN0ZXIxN2NlbGxJRHMudHh0IiwgY29sLm5hbWVzID0gImNsdXN0MTciKQpjbHVzdDE3LmNlbGxzIDwtIHNhcHBseShjbHVzdDE3LmNlbGxzLCBmdW5jdGlvbih4KSBwYXN0ZTAoZ3N1YigiQ01QIiwgIkNNUG0yIiwgeCksICItMSIpKQpjbHVzdDEwLmNlbGxzIDwtIHJlYWQudGFibGUoZmlsZSA9ICIuLi9TZXVyYXR2MV9jbHVzdGVyQ2VsbElEcy9jbHVzdGVyMTBjZWxsSURzLnR4dCIsIGNvbC5uYW1lcyA9ICJjbHVzdDEwIikKY2x1c3QxMC5jZWxscyA8LSBzYXBwbHkoY2x1c3QxMC5jZWxscywgZnVuY3Rpb24oeCkgcGFzdGUwKGdzdWIoIkNNUCIsICJDTVBtMiIsIHgpLCAiLTEiKSkKY2x1c3QxMS5jZWxscyA8LSByZWFkLnRhYmxlKGZpbGUgPSAiLi4vU2V1cmF0djFfY2x1c3RlckNlbGxJRHMvY2x1c3RlcjExY2VsbElEcy50eHQiLCBjb2wubmFtZXMgPSAiY2x1c3QxMSIpCmNsdXN0MTEuY2VsbHMgPC0gc2FwcGx5KGNsdXN0MTEuY2VsbHMsIGZ1bmN0aW9uKHgpIHBhc3RlMChnc3ViKCJDTVAiLCAiQ01QbTIiLCB4KSwgIi0xIikpCmBgYAoKQWRkIG5ldyBtZXRhZGF0YSBjb2x1bW4KYGBge3J9CmNtcC5vYmplY3RAbWV0YS5kYXRhWydjbHVzdC5JRCddIDwtIDAKaGVhZChjbXAub2JqZWN0QG1ldGEuZGF0YSkKYGBgCgpub3cgbWFwIG5ldyBpZHMKYGBge3J9CmNtcC5vYmplY3RAbWV0YS5kYXRhJGNsdXN0LklEW3Jvd25hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSAlaW4lIGNsdXN0My5jZWxsc10gPC0gMwpjbXAub2JqZWN0QG1ldGEuZGF0YSRjbHVzdC5JRFtyb3duYW1lcyhjbXAub2JqZWN0QG1ldGEuZGF0YSkgJWluJSBjbHVzdDE3LmNlbGxzXSA8LSAxNwpjbXAub2JqZWN0QG1ldGEuZGF0YSRjbHVzdC5JRFtyb3duYW1lcyhjbXAub2JqZWN0QG1ldGEuZGF0YSkgJWluJSBjbHVzdDEwLmNlbGxzXSA8LSAxMApjbXAub2JqZWN0QG1ldGEuZGF0YSRjbHVzdC5JRFtyb3duYW1lcyhjbXAub2JqZWN0QG1ldGEuZGF0YSkgJWluJSBjbHVzdDExLmNlbGxzXSA8LSAxMQpgYGAKCmRvIG51bWJlcnMgbWFrZSBzZW5zZT8KYGBge3J9Cm5yb3coY21wLm9iamVjdEBtZXRhLmRhdGFbY21wLm9iamVjdEBtZXRhLmRhdGEkY2x1c3QuSUQgPT0gMTAsXSkKbnJvdyhjbXAub2JqZWN0QG1ldGEuZGF0YVtjbXAub2JqZWN0QG1ldGEuZGF0YSRjbHVzdC5JRCA9PSAxMSxdKQpucm93KGNtcC5vYmplY3RAbWV0YS5kYXRhW2NtcC5vYmplY3RAbWV0YS5kYXRhJGNsdXN0LklEID09IDE3LF0pCm5yb3coY21wLm9iamVjdEBtZXRhLmRhdGFbY21wLm9iamVjdEBtZXRhLmRhdGEkY2x1c3QuSUQgPT0gMyxdKQpgYGAKCgoKCgoKCgojIFRvdGFsIHZhciA5MCUKIyMgTmVpZ2hib3Job29kIGFuZCB1bWFwCnNldCB0b3RhbC52YXIgPC0gOTAlCmBgYHtyfQp0b3QudmFyIDwtIHBlcmNlbnQudmFyaWFuY2UoY21wLm9iamVjdEByZWR1Y3Rpb25zJHBjYUBzdGRldiwgcGxvdC52YXIgPSBGQUxTRSwgcmV0dXJuLnZhbCA9IFRSVUUpCm5kaW1zIDwtIGxlbmd0aCh3aGljaChjdW1zdW0odG90LnZhcikgPD0gOTApKQoKY21wLm9iamVjdCA8LSBGaW5kTmVpZ2hib3JzKGNtcC5vYmplY3QsIGRpbXMgPSAxOm5kaW1zKQpjbXAub2JqZWN0IDwtIEZpbmRDbHVzdGVycyhjbXAub2JqZWN0LCByZXNvbHV0aW9uID0gMC41KQpjbXAub2JqZWN0IDwtIFJ1blVNQVAoY21wLm9iamVjdCwgZGltcyA9IDE6IG5kaW1zKQoKYGBgClBsb3QgVU1BUAoKYGBge3J9CmZvcih4IGluIGMoMC41LCAxLCAxLjUsIDIsIDIuNSkpewoJY21wLm9iamVjdCA8LSBGaW5kQ2x1c3RlcnMoY21wLm9iamVjdCwgcmVzb2x1dGlvbiA9IHgpCn0Kc2F2ZVJEUyhjbXAub2JqZWN0LCBmaWxlID0gcGFzdGUwKHByb2plY3ROYW1lLCAiX2RpbSIsIG5kaW1zLCAiLlJEUyIpKQpgYGAKCmBgYHtyfQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQlteXBsb3QgPC0gRGltUGxvdChjbXAub2JqZWN0LCAKCQkJCQkJCQkJCQlncm91cC5ieSA9IG1ldGEuY29sLAoJCQkJCQkJCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwgCgkJCQkJCQkJCQkJY29scyA9IGNvbG9yLnBhbGV0dGUKCQkJCQkJCQkJCQkpICsgCgkJCWdndGl0bGUocGFzdGUwKHByb2plY3ROYW1lLCAiIGRpbSIsIG5kaW1zLCAicmVzIiwgZ3N1YigiUk5BX3Nubl9yZXMiLCAiIiwgbWV0YS5jb2wpICkpCgkJcGxvdChteXBsb3QpCgl9Cn0KYGBgCgojIyMgQ2x1c3RyZWUKd2hhdCdzIHRoZSBtYXggcmVzb2x1dGlvbiB3ZSBjYW4gYWNoaWV2ZSB3aGlsZSBrZWVwaWduIGNsdXN0ZXJzIHN0YWJsZT8KYGBge3IgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA1fQpwbG90LnRpdGxlIDwtIHBhc3RlMChwcm9qZWN0TmFtZSwgIl9jbHVzdHJlZV9uZGltIiwgbWF4KGNtcC5vYmplY3RAY29tbWFuZHMkUnVuVU1BUC5STkEucGNhJGRpbXMpKQpteS5jbHVzdHJlZSA8LSBjbHVzdHJlZShjbXAub2JqZWN0LCBwcmVmaXggPSAiUk5BX3Nubl9yZXMuIiwgbm9kZV9jb2xvdXIgPSAic2MzX3N0YWJpbGl0eSIsIGV4cHJzID0gInNjYWxlLmRhdGEiKSArIAoJc2NhbGVfY29sb3JfY29udGludW91cyhsb3cgPSAncmVkMycsIGhpZ2ggPSAnd2hpdGUnKSArIAoJZ2d0aXRsZShwbG90LnRpdGxlKQpwbmcoZmlsZW5hbWUgPSBwYXN0ZTAocGxvdC50aXRsZSwgIi5wbmciKSwgaGVpZ2h0ID0gODAwLCB3aWR0aCA9IDE2MDApCnBsb3QobXkuY2x1c3RyZWUpCmRldi5vZmYoKQoKYGBgCkkgdGhpbmsgSSdtIGxpa2luZyByZXMuMS4wIGZyb20gdGhpcy4gQWx0aG91Z2ggaG93IG11Y2ggZG9lcyB0aGlzIGNoYW5nZSBpZiBJIHVzZSBmZXdlciBQQ3MuLi4KCgoKZm9yIGVhY2ggcmVzb2x1dGlvbiwgbnVtYmVyL3BlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gZWFjaCBjbHVzdGVyPwoKYGBge3J9CnRvdC5jZWxscyA8LSBucm93KGNtcC5vYmplY3RAbWV0YS5kYXRhKQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQluZXcuY2x1c3RlcnMgPC0gc29ydChhcy5udW1lcmljKGxldmVscyhjbXAub2JqZWN0QG1ldGEuZGF0YVtbbWV0YS5jb2xdXSkpKQoJCXN0YXRzLmRmIDwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSAyLCBucm93ID0gbGVuZ3RoKG5ldy5jbHVzdGVycykpKQoJCWNvbG5hbWVzKHN0YXRzLmRmKSA8LSBjKCJudW1fY2VsbHMiLCAicGN0X3BvcCIpCgkJcm93bmFtZXMoc3RhdHMuZGYpIDwtIG5ldy5jbHVzdGVycwoJCW1ldGEuZGYgPC0gY21wLm9iamVjdEBtZXRhLmRhdGEKCQlmb3Iocm93LmlkIGluIHJvd25hbWVzKHN0YXRzLmRmKSl7CgkJCQludW0ueCA8LSBucm93KG1ldGEuZGZbbWV0YS5kZlttZXRhLmNvbF0gPT0gcm93LmlkLF0pCgkJCQlwY3QueCA8LSBhcy5pbnRlZ2VyKG51bS54IC8gdG90LmNlbGxzICoxMDApCgkJCQkjIHByaW50KHBjdC54KQoJCQkJc3RhdHMuZGZbcm93LmlkLCAibnVtX2NlbGxzIl0gPC0gbnVtLngKCQkJCXN0YXRzLmRmW3Jvdy5pZCwgInBjdF9wb3AiXSA8LSBwY3QueAoJCX0KCQlwcmludChzdGF0cy5kZikKCX0KfQpgYGAKCgoKRm9yIGVhY2ggcmVzb2x1dGlvbiwgd2hhdCBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGVhY2ggY2x1c3RlciBhcmUgZW5yaWNoZWQgZm9yIG9uZSBvZiBvdXIgY2x1c3QuSURzPwoKClRlc3Q6IHdoYXQgcGVyY2VudGFnZSBvZiBlYWNoIG5ldyBjbHVzdGVySUQgbWF0Y2hlcyBvbmUgb2YgdGhlIG9sZGVyIGNsdXN0ZXJzPwpgYGB7cn0KZm9yIChtZXRhLmNvbCBpbiBjb2xuYW1lcyhjbXAub2JqZWN0QG1ldGEuZGF0YSkpewoJaWYoZ3JlcGwocGF0dGVybiA9ICgiUk5BX3Nubl9yZXMiKSwgeCA9IG1ldGEuY29sKT09VFJVRSl7CgkJbmV3LmNsdXN0ZXJzIDwtIHNvcnQoYXMubnVtZXJpYyhsZXZlbHMoY21wLm9iamVjdEBtZXRhLmRhdGFbW21ldGEuY29sXV0pKSkKCQllbnJpY2guZGYgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDQsIG5yb3cgPSBsZW5ndGgobmV3LmNsdXN0ZXJzKSkpCgkJY29sbmFtZXMoZW5yaWNoLmRmKSA8LSBjKDMsIDE3LCAxMCwgMTEpCgkJcm93bmFtZXMoZW5yaWNoLmRmKSA8LSBuZXcuY2x1c3RlcnMKCQltZXRhLmRmIDwtIGNtcC5vYmplY3RAbWV0YS5kYXRhCgkJZm9yKHJvdy5pZCBpbiByb3duYW1lcyhlbnJpY2guZGYpKXsKCQkJdG90LmNsdXMgPC0gbnJvdyhtZXRhLmRmW21ldGEuZGZbW21ldGEuY29sXV0gPT0gcm93LmlkLF0pCgkJCWZvcihjb2wuaWQgaW4gY29sbmFtZXMoZW5yaWNoLmRmKSl7CgkJCQludW0ueCA8LSBucm93KG1ldGEuZGZbKG1ldGEuZGZbW21ldGEuY29sXV0gPT0gcm93LmlkKSAmIChtZXRhLmRmJGNsdXN0LklEID09IGNvbC5pZCksXSkKCQkJCXBjdC54IDwtIGFzLmludGVnZXIobnVtLnggLyB0b3QuY2x1cyAqMTAwKQoJCQkJIyBwcmludChwY3QueCkKCQkJCWVucmljaC5kZltyb3cuaWQsIGNvbC5pZF0gPC0gcGN0LngKCQkJfQoJCX0KCQljb2xuYW1lcyhlbnJpY2guZGYpIDwtIHNhcHBseShjb2xuYW1lcyhlbnJpY2guZGYpLCBmdW5jdGlvbih4KSBwYXN0ZTAoIm9sZGNsdXN0ZXIiLCB4KSkKCQlyb3duYW1lcyhlbnJpY2guZGYpIDwtIHNhcHBseShyb3duYW1lcyhlbnJpY2guZGYpLCBmdW5jdGlvbih4KSBwYXN0ZTAoIm5ld2NsdXN0ZXIiLCB4KSkKCQl4bHN4Ojp3cml0ZS54bHN4KGVucmljaC5kZiwgZmlsZSA9IHBhc3RlMCgiUGN0T2ZOZXdDbHVzdGVyc092ZXJsYXBwaW5nT2xkQ2x1c3RlcnNfIiwgcHJvamVjdE5hbWUsICJfZGltIiwgbmRpbXMsICIueGxzeCIpLCBzaGVldE5hbWUgPSBwYXN0ZTAoZ3N1YigiUk5BX3Nubl8iLCAiIiwgbWV0YS5jb2wpKSwgYXBwZW5kID0gVFJVRSkKCQlwcmludChlbnJpY2guZGYpCgl9Cn0KCmBgYApBYnNvbHV0ZWx5IHRlcnJpYmxlIG92ZXJsYXAsIG5vIGVucmljaG1lbnQgb2YgYW55IG9mIHRoZXNlIGFjcm9zcyB0aGUgbmV3IGNsdXN0ZXJpbmcgYWxnb3JpdGhtLiBNYXliZSBzaG91bGQgdHJ5IDk1JSB2YXJpYXRpb24gY292ZXJlZAoKIyMgRmluZCBvbGQgY2VsbHMgb24gVU1BUAoKdGltZSBmb3IgdGhlIHN1cGVyIHNjYXJleSBtb21lbnQgdG8gc2VlIGlmIHRoZSBjZWxscyBmcm9tIHNldXJhdHYxIHN0aWxsIGNsdXN0ZXIgdG9nZXRoZXIgb24gaW4gc2V1cmF0IHY0CgpgYGB7ciBmaWcud2lkdGggPSA0fQpEaW1QbG90KGNtcC5vYmplY3QsCgkJCQlyZWR1Y3Rpb24gPSAidW1hcCIsCgkJCQlncm91cC5ieSA9ICJjbHVzdC5JRCIsIAoJCQkJIyBzcGxpdC5ieSA9ICJvcmlnLmlkZW50IiwKCQkJCWNvbHMgPSBjKCJncmF5IiwgIm9yYW5nZSIsICJibHVlIiwgInJlZCIsICJncmVlbiIpLCkKYGBgCmBgYHtyIGZpZy53aWR0aCA9IDR9CkRpbVBsb3QoY21wLm9iamVjdCwKCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwKCQkJCWdyb3VwLmJ5ID0gIm9yaWcuaWRlbnQiLCAKCQkJCXNwbGl0LmJ5ID0gImNsdXN0LklEIiwKCQkJCWNvbHMgPSBjKCJncmF5IiwgIm9yYW5nZSIsICJibHVlIiwgInJlZCIsICJncmVlbiIpLCkKYGBgCgoKIyBUb3RhbCB2YXIgODUlCiMjIE5laWdoYm9yaG9vZCBhbmQgdW1hcApzZXQgdG90YWwudmFyIDwtIDg1JQpgYGB7cn0KdG90LnZhciA8LSBwZXJjZW50LnZhcmlhbmNlKGNtcC5vYmplY3RAcmVkdWN0aW9ucyRwY2FAc3RkZXYsIHBsb3QudmFyID0gRkFMU0UsIHJldHVybi52YWwgPSBUUlVFKQpuZGltcyA8LSBsZW5ndGgod2hpY2goY3Vtc3VtKHRvdC52YXIpIDw9IDg1KSkKCmNtcC5vYmplY3QgPC0gRmluZE5laWdoYm9ycyhjbXAub2JqZWN0LCBkaW1zID0gMTpuZGltcykKY21wLm9iamVjdCA8LSBGaW5kQ2x1c3RlcnMoY21wLm9iamVjdCwgcmVzb2x1dGlvbiA9IDAuNSkKY21wLm9iamVjdCA8LSBSdW5VTUFQKGNtcC5vYmplY3QsIGRpbXMgPSAxOiBuZGltcykKCmBgYApQbG90IFVNQVAKCmBgYHtyfQpmb3IoeCBpbiBjKDAuNSwgMSwgMS41LCAyLCAyLjUpKXsKCWNtcC5vYmplY3QgPC0gRmluZENsdXN0ZXJzKGNtcC5vYmplY3QsIHJlc29sdXRpb24gPSB4KQpzYXZlUkRTKGNtcC5vYmplY3QsIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfZGltIiwgbmRpbXMsICIuUkRTIikpCn0KYGBgCgpgYGB7cn0KZm9yIChtZXRhLmNvbCBpbiBjb2xuYW1lcyhjbXAub2JqZWN0QG1ldGEuZGF0YSkpewoJaWYoZ3JlcGwocGF0dGVybiA9ICgiUk5BX3Nubl9yZXMiKSwgeCA9IG1ldGEuY29sKT09VFJVRSl7CgkJbXlwbG90IDwtIERpbVBsb3QoY21wLm9iamVjdCwgCgkJCQkJCQkJCQkJZ3JvdXAuYnkgPSBtZXRhLmNvbCwKCQkJCQkJCQkJCQlyZWR1Y3Rpb24gPSAidW1hcCIsIAoJCQkJCQkJCQkJCWNvbHMgPSBjb2xvci5wYWxldHRlCgkJCQkJCQkJCQkJKSArIAoJCQlnZ3RpdGxlKHBhc3RlMChwcm9qZWN0TmFtZSwgIiBkaW0iLCBuZGltcywgInJlcyIsIGdzdWIoIlJOQV9zbm5fcmVzIiwgIiIsIG1ldGEuY29sKSApKQoJCXBsb3QobXlwbG90KQoJfQp9CmBgYAoKIyMjIENsdXN0cmVlCndoYXQncyB0aGUgbWF4IHJlc29sdXRpb24gd2UgY2FuIGFjaGlldmUgd2hpbGUga2VlcGlnbiBjbHVzdGVycyBzdGFibGU/CmBgYHtyIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNX0KcGxvdC50aXRsZSA8LSBwYXN0ZTAocHJvamVjdE5hbWUsICJfY2x1c3RyZWVfbmRpbSIsIG1heChjbXAub2JqZWN0QGNvbW1hbmRzJFJ1blVNQVAuUk5BLnBjYSRkaW1zKSkKbXkuY2x1c3RyZWUgPC0gY2x1c3RyZWUoY21wLm9iamVjdCwgcHJlZml4ID0gIlJOQV9zbm5fcmVzLiIsIG5vZGVfY29sb3VyID0gInNjM19zdGFiaWxpdHkiLCBleHBycyA9ICJzY2FsZS5kYXRhIikgKyAKCXNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobG93ID0gJ3JlZDMnLCBoaWdoID0gJ3doaXRlJykgKyAKCWdndGl0bGUocGxvdC50aXRsZSkKcG5nKGZpbGVuYW1lID0gcGFzdGUwKHBsb3QudGl0bGUsICIucG5nIiksIGhlaWdodCA9IDgwMCwgd2lkdGggPSAxNjAwKQpwbG90KG15LmNsdXN0cmVlKQpkZXYub2ZmKCkKYGBgCgoKCmZvciBlYWNoIHJlc29sdXRpb24sIG51bWJlci9wZXJjZW50YWdlIG9mIGNlbGxzIGluIGVhY2ggY2x1c3Rlcj8KCmBgYHtyfQp0b3QuY2VsbHMgPC0gbnJvdyhjbXAub2JqZWN0QG1ldGEuZGF0YSkKZm9yIChtZXRhLmNvbCBpbiBjb2xuYW1lcyhjbXAub2JqZWN0QG1ldGEuZGF0YSkpewoJaWYoZ3JlcGwocGF0dGVybiA9ICgiUk5BX3Nubl9yZXMiKSwgeCA9IG1ldGEuY29sKT09VFJVRSl7CgkJbmV3LmNsdXN0ZXJzIDwtIHNvcnQoYXMubnVtZXJpYyhsZXZlbHMoY21wLm9iamVjdEBtZXRhLmRhdGFbW21ldGEuY29sXV0pKSkKCQlzdGF0cy5kZiA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gMiwgbnJvdyA9IGxlbmd0aChuZXcuY2x1c3RlcnMpKSkKCQljb2xuYW1lcyhzdGF0cy5kZikgPC0gYygibnVtX2NlbGxzIiwgInBjdF9wb3AiKQoJCXJvd25hbWVzKHN0YXRzLmRmKSA8LSBuZXcuY2x1c3RlcnMKCQltZXRhLmRmIDwtIGNtcC5vYmplY3RAbWV0YS5kYXRhCgkJZm9yKHJvdy5pZCBpbiByb3duYW1lcyhzdGF0cy5kZikpewoJCQkJbnVtLnggPC0gbnJvdyhtZXRhLmRmW21ldGEuZGZbbWV0YS5jb2xdID09IHJvdy5pZCxdKQoJCQkJcGN0LnggPC0gYXMuaW50ZWdlcihudW0ueCAvIHRvdC5jZWxscyAqMTAwKQoJCQkJIyBwcmludChwY3QueCkKCQkJCXN0YXRzLmRmW3Jvdy5pZCwgIm51bV9jZWxscyJdIDwtIG51bS54CgkJCQlzdGF0cy5kZltyb3cuaWQsICJwY3RfcG9wIl0gPC0gcGN0LngKCQl9CgkJcHJpbnQoc3RhdHMuZGYpCgl9Cn0KYGBgCgojIyBJZGVudGlmeSB2YXJpYWJsZSBnZW5lcyBmb3IgbmV3IGJpb21hcmsKYGBge3J9Cmxlbmd0aChjbXAub2JqZWN0QGFzc2F5cyRSTkFAdmFyLmZlYXR1cmVzKQpgYGAKCgoKCgojIyMgR2VuZSBwcm9maWxlcyBvZiBjbHVzdGVycwpzZXQgaWRlbnQgYXQgcmVzID0gMSBhbmQgZ2V0IG1hcmtlcnMKYGBge3J9CklkZW50cyhjbXAub2JqZWN0KSA8LSAiUk5BX3Nubl9yZXMuMSIKY21wLmFsbG1hcmtlcnMucmVzMSA8LSBGaW5kQWxsTWFya2VycyhjbXAub2JqZWN0KQpjbXAudG9wMTAwbWFya2Vycy5yZXMxIDwtIGNtcC5hbGxtYXJrZXJzLnJlczEgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbihuID0gMTAwLCB3dCA9IGFicyhhdmdfbG9nMkZDKSkKYGBgCgpgYGB7cn0KY21wLnRvcDEwMG1hcmtlcnMucmVzMSA8LSBjbXAuYWxsbWFya2Vycy5yZXMxICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24obiA9IDEwMCwgd3QgPSBhYnMoYXZnX2xvZzJGQykpCmNtcC50b3AxMDBtYXJrZXJzLnJlczEgPC0gY21wLnRvcDEwMG1hcmtlcnMucmVzMVtjbXAudG9wMTAwbWFya2Vycy5yZXMxJHBfdmFsX2FkaiA8PSAwLjA1LCBdCmZvcihjbHVzdGVyIGluIHVuaXF1ZShjbXAudG9wMTAwbWFya2Vycy5yZXMxJGNsdXN0ZXIpKXsKCW51bS5oaXRzIDwtIG5yb3coY21wLnRvcDEwMG1hcmtlcnMucmVzMVtjbXAudG9wMTAwbWFya2Vycy5yZXMxJGNsdXN0ZXIgPT0gY2x1c3RlciwgXSkKCXByaW50KHBhc3RlKCJjbHVzdGVyIiwgY2x1c3RlciwgImhhcyIsIG51bS5oaXRzLCAiZ2VuZXMiKSkKfQpgYGAKRmluZCB0b3AudmFyCWdlbmVzIGluIGNtcC50b3AxMDBtYXJrZXJzLnJlczEKCmBgYHtyfQp0b3AudmFyIDwtIGNtcC5vYmplY3RAYXNzYXlzJFJOQUB2YXIuZmVhdHVyZXNbMToxNTBdCiMgdG9wLnZhcgpuLnZhcmdlbmVzIDwtIGMoKQpmb3IoZ2VuZSBpbiB0b3AudmFyKXsKCWlmKGdlbmUgJWluJSBjbXAudG9wMTAwbWFya2Vycy5yZXMxJGdlbmUpewoJCW4udmFyZ2VuZXMgPC0gYyhuLnZhcmdlbmVzLCBnZW5lKQoJfQp9CnByaW50KGxlbmd0aChuLnZhcmdlbmVzKSkKdG9wLnZhclshKHRvcC52YXIgJWluJSBuLnZhcmdlbmVzKV0KYGBgCgoKCgoKRm9yIGVhY2ggcmVzb2x1dGlvbiwgd2hhdCBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGVhY2ggY2x1c3RlciBhcmUgZW5yaWNoZWQgZm9yIG9uZSBvZiBvdXIgY2x1c3QuSURzPwoKClRlc3Q6IHdoYXQgcGVyY2VudGFnZSBvZiBlYWNoIG5ldyBjbHVzdGVySUQgbWF0Y2hlcyBvbmUgb2YgdGhlIG9sZGVyIGNsdXN0ZXJzPwpgYGB7cn0KZm9yIChtZXRhLmNvbCBpbiBjb2xuYW1lcyhjbXAub2JqZWN0QG1ldGEuZGF0YSkpewoJaWYoZ3JlcGwocGF0dGVybiA9ICgiUk5BX3Nubl9yZXMiKSwgeCA9IG1ldGEuY29sKT09VFJVRSl7CgkJbmV3LmNsdXN0ZXJzIDwtIHNvcnQoYXMubnVtZXJpYyhsZXZlbHMoY21wLm9iamVjdEBtZXRhLmRhdGFbW21ldGEuY29sXV0pKSkKCQllbnJpY2guZGYgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDQsIG5yb3cgPSBsZW5ndGgobmV3LmNsdXN0ZXJzKSkpCgkJY29sbmFtZXMoZW5yaWNoLmRmKSA8LSBjKDMsIDE3LCAxMCwgMTEpCgkJcm93bmFtZXMoZW5yaWNoLmRmKSA8LSBuZXcuY2x1c3RlcnMKCQltZXRhLmRmIDwtIGNtcC5vYmplY3RAbWV0YS5kYXRhCgkJZm9yKHJvdy5pZCBpbiByb3duYW1lcyhlbnJpY2guZGYpKXsKCQkJdG90LmNsdXMgPC0gbnJvdyhtZXRhLmRmW21ldGEuZGZbW21ldGEuY29sXV0gPT0gcm93LmlkLF0pCgkJCWZvcihjb2wuaWQgaW4gY29sbmFtZXMoZW5yaWNoLmRmKSl7CgkJCQludW0ueCA8LSBucm93KG1ldGEuZGZbKG1ldGEuZGZbW21ldGEuY29sXV0gPT0gcm93LmlkKSAmIChtZXRhLmRmJGNsdXN0LklEID09IGNvbC5pZCksXSkKCQkJCXBjdC54IDwtIGFzLmludGVnZXIobnVtLnggLyB0b3QuY2x1cyAqMTAwKQoJCQkJIyBwcmludChwY3QueCkKCQkJCWVucmljaC5kZltyb3cuaWQsIGNvbC5pZF0gPC0gcGN0LngKCQkJfQoJCX0KCQljb2xuYW1lcyhlbnJpY2guZGYpIDwtIHNhcHBseShjb2xuYW1lcyhlbnJpY2guZGYpLCBmdW5jdGlvbih4KSBwYXN0ZTAoIm9sZGNsdXN0ZXIiLCB4KSkKCQlyb3duYW1lcyhlbnJpY2guZGYpIDwtIHNhcHBseShyb3duYW1lcyhlbnJpY2guZGYpLCBmdW5jdGlvbih4KSBwYXN0ZTAoIm5ld2NsdXN0ZXIiLCB4KSkKCQl4bHN4Ojp3cml0ZS54bHN4KGVucmljaC5kZiwgZmlsZSA9IHBhc3RlMCgiUGN0T2ZOZXdDbHVzdGVyc092ZXJsYXBwaW5nT2xkQ2x1c3RlcnNfIiwgcHJvamVjdE5hbWUsICJfZGltIiwgbmRpbXMsICIueGxzeCIpLCBzaGVldE5hbWUgPSBwYXN0ZTAoZ3N1YigiUk5BX3Nubl8iLCAiIiwgbWV0YS5jb2wpKSwgYXBwZW5kID0gVFJVRSkKCQlwcmludChlbnJpY2guZGYpCgl9Cn0KCmBgYApBYnNvbHV0ZWx5IHRlcnJpYmxlIG92ZXJsYXAsIG5vIGVucmljaG1lbnQgb2YgYW55IG9mIHRoZXNlIGFjcm9zcyB0aGUgbmV3IGNsdXN0ZXJpbmcgYWxnb3JpdGhtLiBNYXliZSBzaG91bGQgdHJ5IDk1JSB2YXJpYXRpb24gY292ZXJlZAoKIyMgRmluZCBvbGQgY2VsbHMgb24gVU1BUAoKdGltZSBmb3IgdGhlIHN1cGVyIHNjYXJleSBtb21lbnQgdG8gc2VlIGlmIHRoZSBjZWxscyBmcm9tIHNldXJhdHYxIHN0aWxsIGNsdXN0ZXIgdG9nZXRoZXIgb24gaW4gc2V1cmF0IHY0CgpgYGB7ciBmaWcud2lkdGggPSA0fQpEaW1QbG90KGNtcC5vYmplY3QsCgkJCQlyZWR1Y3Rpb24gPSAidW1hcCIsCgkJCQlncm91cC5ieSA9ICJjbHVzdC5JRCIsIAoJCQkJIyBzcGxpdC5ieSA9ICJvcmlnLmlkZW50IiwKCQkJCWNvbHMgPSBjKCJncmF5IiwgIm9yYW5nZSIsICJibHVlIiwgInJlZCIsICJncmVlbiIpLCkKYGBgCmBgYHtyIGZpZy53aWR0aCA9IDR9CkRpbVBsb3QoY21wLm9iamVjdCwKCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwKCQkJCWdyb3VwLmJ5ID0gIm9yaWcuaWRlbnQiLCAKCQkJCXNwbGl0LmJ5ID0gImNsdXN0LklEIiwKCQkJCWNvbHMgPSBjKCJncmF5IiwgIm9yYW5nZSIsICJibHVlIiwgInJlZCIsICJncmVlbiIpLCkKYGBgCgoKCiMgVG90YWwgdmFyIDgwJQojIyBOZWlnaGJvcmhvb2QgYW5kIHVtYXAKc2V0IHRvdGFsLnZhciA8LSA4MCUKYGBge3J9CnRvdC52YXIgPC0gcGVyY2VudC52YXJpYW5jZShjbXAub2JqZWN0QHJlZHVjdGlvbnMkcGNhQHN0ZGV2LCBwbG90LnZhciA9IEZBTFNFLCByZXR1cm4udmFsID0gVFJVRSkKbmRpbXMgPC0gbGVuZ3RoKHdoaWNoKGN1bXN1bSh0b3QudmFyKSA8PSA4MCkpCgpjbXAub2JqZWN0IDwtIEZpbmROZWlnaGJvcnMoY21wLm9iamVjdCwgZGltcyA9IDE6bmRpbXMpCmNtcC5vYmplY3QgPC0gRmluZENsdXN0ZXJzKGNtcC5vYmplY3QsIHJlc29sdXRpb24gPSAwLjUpCmNtcC5vYmplY3QgPC0gUnVuVU1BUChjbXAub2JqZWN0LCBkaW1zID0gMTogbmRpbXMpCgpgYGAKUGxvdCBVTUFQCgpgYGB7cn0KZm9yKHggaW4gYygwLjUsIDEsIDEuNSwgMiwgMi41KSl7CgljbXAub2JqZWN0IDwtIEZpbmRDbHVzdGVycyhjbXAub2JqZWN0LCByZXNvbHV0aW9uID0geCkKc2F2ZVJEUyhjbXAub2JqZWN0LCBmaWxlID0gcGFzdGUwKHByb2plY3ROYW1lLCAiX2RpbSIsIG5kaW1zLCAiLlJEUyIpKQp9CmBgYAoKYGBge3J9CmZvciAobWV0YS5jb2wgaW4gY29sbmFtZXMoY21wLm9iamVjdEBtZXRhLmRhdGEpKXsKCWlmKGdyZXBsKHBhdHRlcm4gPSAoIlJOQV9zbm5fcmVzIiksIHggPSBtZXRhLmNvbCk9PVRSVUUpewoJCW15cGxvdCA8LSBEaW1QbG90KGNtcC5vYmplY3QsIAoJCQkJCQkJCQkJCWdyb3VwLmJ5ID0gbWV0YS5jb2wsCgkJCQkJCQkJCQkJcmVkdWN0aW9uID0gInVtYXAiLCAKCQkJCQkJCQkJCQljb2xzID0gY29sb3IucGFsZXR0ZQoJCQkJCQkJCQkJCSkgKyAKCQkJZ2d0aXRsZShwYXN0ZTAocHJvamVjdE5hbWUsICIgZGltIiwgbmRpbXMsICJyZXMiLCBnc3ViKCJSTkFfc25uX3JlcyIsICIiLCBtZXRhLmNvbCkgKSkKCQlwbG90KG15cGxvdCkKCX0KfQpgYGAKCiMjIyBDbHVzdHJlZQp3aGF0J3MgdGhlIG1heCByZXNvbHV0aW9uIHdlIGNhbiBhY2hpZXZlIHdoaWxlIGtlZXBpZ24gY2x1c3RlcnMgc3RhYmxlPwpgYGB7ciBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDV9CnBsb3QudGl0bGUgPC0gcGFzdGUwKHByb2plY3ROYW1lLCAiX2NsdXN0cmVlX25kaW0iLCBtYXgoY21wLm9iamVjdEBjb21tYW5kcyRSdW5VTUFQLlJOQS5wY2EkZGltcykpCm15LmNsdXN0cmVlIDwtIGNsdXN0cmVlKGNtcC5vYmplY3QsIHByZWZpeCA9ICJSTkFfc25uX3Jlcy4iLCBub2RlX2NvbG91ciA9ICJzYzNfc3RhYmlsaXR5IiwgZXhwcnMgPSAic2NhbGUuZGF0YSIpICsgCglzY2FsZV9jb2xvcl9jb250aW51b3VzKGxvdyA9ICdyZWQzJywgaGlnaCA9ICd3aGl0ZScpICsgCglnZ3RpdGxlKHBsb3QudGl0bGUpCnBuZyhmaWxlbmFtZSA9IHBhc3RlMChwbG90LnRpdGxlLCAiLnBuZyIpLCBoZWlnaHQgPSA4MDAsIHdpZHRoID0gMTYwMCkKcGxvdChteS5jbHVzdHJlZSkKZGV2Lm9mZigpCmBgYAoKCgpmb3IgZWFjaCByZXNvbHV0aW9uLCBudW1iZXIvcGVyY2VudGFnZSBvZiBjZWxscyBpbiBlYWNoIGNsdXN0ZXI/CgpgYGB7cn0KdG90LmNlbGxzIDwtIG5yb3coY21wLm9iamVjdEBtZXRhLmRhdGEpCmZvciAobWV0YS5jb2wgaW4gY29sbmFtZXMoY21wLm9iamVjdEBtZXRhLmRhdGEpKXsKCWlmKGdyZXBsKHBhdHRlcm4gPSAoIlJOQV9zbm5fcmVzIiksIHggPSBtZXRhLmNvbCk9PVRSVUUpewoJCW5ldy5jbHVzdGVycyA8LSBzb3J0KGFzLm51bWVyaWMobGV2ZWxzKGNtcC5vYmplY3RAbWV0YS5kYXRhW1ttZXRhLmNvbF1dKSkpCgkJc3RhdHMuZGYgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDIsIG5yb3cgPSBsZW5ndGgobmV3LmNsdXN0ZXJzKSkpCgkJY29sbmFtZXMoc3RhdHMuZGYpIDwtIGMoIm51bV9jZWxscyIsICJwY3RfcG9wIikKCQlyb3duYW1lcyhzdGF0cy5kZikgPC0gbmV3LmNsdXN0ZXJzCgkJbWV0YS5kZiA8LSBjbXAub2JqZWN0QG1ldGEuZGF0YQoJCWZvcihyb3cuaWQgaW4gcm93bmFtZXMoc3RhdHMuZGYpKXsKCQkJCW51bS54IDwtIG5yb3cobWV0YS5kZlttZXRhLmRmW21ldGEuY29sXSA9PSByb3cuaWQsXSkKCQkJCXBjdC54IDwtIGFzLmludGVnZXIobnVtLnggLyB0b3QuY2VsbHMgKjEwMCkKCQkJCSMgcHJpbnQocGN0LngpCgkJCQlzdGF0cy5kZltyb3cuaWQsICJudW1fY2VsbHMiXSA8LSBudW0ueAoJCQkJc3RhdHMuZGZbcm93LmlkLCAicGN0X3BvcCJdIDwtIHBjdC54CgkJfQoJCXByaW50KHN0YXRzLmRmKQoJfQp9CmBgYAoKCgpGb3IgZWFjaCByZXNvbHV0aW9uLCB3aGF0IHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gZWFjaCBjbHVzdGVyIGFyZSBlbnJpY2hlZCBmb3Igb25lIG9mIG91ciBjbHVzdC5JRHM/CgoKVGVzdDogd2hhdCBwZXJjZW50YWdlIG9mIGVhY2ggbmV3IGNsdXN0ZXJJRCBtYXRjaGVzIG9uZSBvZiB0aGUgb2xkZXIgY2x1c3RlcnM/CmBgYHtyfQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQluZXcuY2x1c3RlcnMgPC0gc29ydChhcy5udW1lcmljKGxldmVscyhjbXAub2JqZWN0QG1ldGEuZGF0YVtbbWV0YS5jb2xdXSkpKQoJCWVucmljaC5kZiA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gNCwgbnJvdyA9IGxlbmd0aChuZXcuY2x1c3RlcnMpKSkKCQljb2xuYW1lcyhlbnJpY2guZGYpIDwtIGMoMywgMTcsIDEwLCAxMSkKCQlyb3duYW1lcyhlbnJpY2guZGYpIDwtIG5ldy5jbHVzdGVycwoJCW1ldGEuZGYgPC0gY21wLm9iamVjdEBtZXRhLmRhdGEKCQlmb3Iocm93LmlkIGluIHJvd25hbWVzKGVucmljaC5kZikpewoJCQl0b3QuY2x1cyA8LSBucm93KG1ldGEuZGZbbWV0YS5kZltbbWV0YS5jb2xdXSA9PSByb3cuaWQsXSkKCQkJZm9yKGNvbC5pZCBpbiBjb2xuYW1lcyhlbnJpY2guZGYpKXsKCQkJCW51bS54IDwtIG5yb3cobWV0YS5kZlsobWV0YS5kZltbbWV0YS5jb2xdXSA9PSByb3cuaWQpICYgKG1ldGEuZGYkY2x1c3QuSUQgPT0gY29sLmlkKSxdKQoJCQkJcGN0LnggPC0gYXMuaW50ZWdlcihudW0ueCAvIHRvdC5jbHVzICoxMDApCgkJCQkjIHByaW50KHBjdC54KQoJCQkJZW5yaWNoLmRmW3Jvdy5pZCwgY29sLmlkXSA8LSBwY3QueAoJCQl9CgkJfQoJCWNvbG5hbWVzKGVucmljaC5kZikgPC0gc2FwcGx5KGNvbG5hbWVzKGVucmljaC5kZiksIGZ1bmN0aW9uKHgpIHBhc3RlMCgib2xkY2x1c3RlciIsIHgpKQoJCXJvd25hbWVzKGVucmljaC5kZikgPC0gc2FwcGx5KHJvd25hbWVzKGVucmljaC5kZiksIGZ1bmN0aW9uKHgpIHBhc3RlMCgibmV3Y2x1c3RlciIsIHgpKQoJCXhsc3g6OndyaXRlLnhsc3goZW5yaWNoLmRmLCBmaWxlID0gcGFzdGUwKCJQY3RPZk5ld0NsdXN0ZXJzT3ZlcmxhcHBpbmdPbGRDbHVzdGVyc18iLCBwcm9qZWN0TmFtZSwgIl9kaW0iLCBuZGltcywgIi54bHN4IiksIHNoZWV0TmFtZSA9IHBhc3RlMChnc3ViKCJSTkFfc25uXyIsICIiLCBtZXRhLmNvbCkpLCBhcHBlbmQgPSBUUlVFKQoJCXByaW50KGVucmljaC5kZikKCX0KfQoKYGBgCkFic29sdXRlbHkgdGVycmlibGUgb3ZlcmxhcCwgbm8gZW5yaWNobWVudCBvZiBhbnkgb2YgdGhlc2UgYWNyb3NzIHRoZSBuZXcgY2x1c3RlcmluZyBhbGdvcml0aG0uIE1heWJlIHNob3VsZCB0cnkgOTUlIHZhcmlhdGlvbiBjb3ZlcmVkCgojIyBGaW5kIG9sZCBjZWxscyBvbiBVTUFQCgp0aW1lIGZvciB0aGUgc3VwZXIgc2NhcmV5IG1vbWVudCB0byBzZWUgaWYgdGhlIGNlbGxzIGZyb20gc2V1cmF0djEgc3RpbGwgY2x1c3RlciB0b2dldGhlciBvbiBpbiBzZXVyYXQgdjQKCmBgYHtyIGZpZy53aWR0aCA9IDR9CkRpbVBsb3QoY21wLm9iamVjdCwKCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwKCQkJCWdyb3VwLmJ5ID0gImNsdXN0LklEIiwgCgkJCQkjIHNwbGl0LmJ5ID0gIm9yaWcuaWRlbnQiLAoJCQkJY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIiksKQpgYGAKYGBge3IgZmlnLndpZHRoID0gNH0KRGltUGxvdChjbXAub2JqZWN0LAoJCQkJcmVkdWN0aW9uID0gInVtYXAiLAoJCQkJZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIsIAoJCQkJc3BsaXQuYnkgPSAiY2x1c3QuSUQiLAoJCQkJY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIiksKQpgYGAKCgoKIyBUb3RhbCB2YXIgOTUlCgojIyBOZWlnaGJvcmhvb2QgYW5kIHVtYXAKc2V0IHRvdGFsLnZhciA8LSA5NSUKYGBge3J9CnRvdC52YXIgPC0gcGVyY2VudC52YXJpYW5jZShjbXAub2JqZWN0QHJlZHVjdGlvbnMkcGNhQHN0ZGV2LCBwbG90LnZhciA9IEZBTFNFLCByZXR1cm4udmFsID0gVFJVRSkKbmRpbXMgPC0gbGVuZ3RoKHdoaWNoKGN1bXN1bSh0b3QudmFyKSA8PSA5NSkpCgpjbXAub2JqZWN0IDwtIEZpbmROZWlnaGJvcnMoY21wLm9iamVjdCwgZGltcyA9IDE6bmRpbXMpCmNtcC5vYmplY3QgPC0gRmluZENsdXN0ZXJzKGNtcC5vYmplY3QsIHJlc29sdXRpb24gPSAwLjUpCmNtcC5vYmplY3QgPC0gUnVuVU1BUChjbXAub2JqZWN0LCBkaW1zID0gMTogbmRpbXMpCgpgYGAKUGxvdCBVTUFQCgpgYGB7cn0KZm9yKHggaW4gYygwLjUsIDEsIDEuNSwgMiwgMi41KSl7CgljbXAub2JqZWN0IDwtIEZpbmRDbHVzdGVycyhjbXAub2JqZWN0LCByZXNvbHV0aW9uID0geCkKfQpzYXZlUkRTKGNtcC5vYmplY3QsIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfZGltIiwgbmRpbXMsICIuUkRTIikpCmBgYAoKYGBge3J9CmNtcC5vYmplY3QgPC0gcmVhZFJEUygiQ01QX2RpbTQxLlJEUyIpCmBgYAoKCmBgYHtyIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNX0KcGxvdC50aXRsZSA8LSBwYXN0ZTAocHJvamVjdE5hbWUsICJfY2x1c3RyZWVfbmRpbSIsIG1heChjbXAub2JqZWN0QGNvbW1hbmRzJFJ1blVNQVAuUk5BLnBjYSRkaW1zKSkKbXkuY2x1c3RyZWUgPC0gY2x1c3RyZWUoY21wLm9iamVjdCwgcHJlZml4ID0gIlJOQV9zbm5fcmVzLiIsIG5vZGVfY29sb3VyID0gInNjM19zdGFiaWxpdHkiLCBleHBycyA9ICJzY2FsZS5kYXRhIikgKyAKCXNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobG93ID0gJ3JlZDMnLCBoaWdoID0gJ3doaXRlJykgKyAKCWdndGl0bGUocGxvdC50aXRsZSkKcG5nKGZpbGVuYW1lID0gcGFzdGUwKHBsb3QudGl0bGUsICIucG5nIiksIGhlaWdodCA9IDgwMCwgd2lkdGggPSAxNjAwKQpwbG90KG15LmNsdXN0cmVlKQpkZXYub2ZmKCkKYGBgCgpGb3IgZWFjaCByZXNvbHV0aW9uLCB3aGF0IHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gZWFjaCBjbHVzdGVyIGFyZSBlbnJpY2hlZCBmb3Igb25lIG9mIG91ciBjbHVzdC5JRHM/CgoKVGVzdDogd2hhdCBwZXJjZW50YWdlIG9mIGVhY2ggbmV3IGNsdXN0ZXJJRCBtYXRjaGVzIG9uZSBvZiB0aGUgb2xkZXIgY2x1c3RlcnM/CmBgYHtyfQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQluZXcuY2x1c3RlcnMgPC0gc29ydChhcy5udW1lcmljKGxldmVscyhjbXAub2JqZWN0QG1ldGEuZGF0YVtbbWV0YS5jb2xdXSkpKQoJCWVucmljaC5kZiA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gNCwgbnJvdyA9IGxlbmd0aChuZXcuY2x1c3RlcnMpKSkKCQljb2xuYW1lcyhlbnJpY2guZGYpIDwtIGMoMywgMTcsIDEwLCAxMSkKCQlyb3duYW1lcyhlbnJpY2guZGYpIDwtIG5ldy5jbHVzdGVycwoJCW1ldGEuZGYgPC0gY21wLm9iamVjdEBtZXRhLmRhdGEKCQlmb3Iocm93LmlkIGluIHJvd25hbWVzKGVucmljaC5kZikpewoJCQl0b3QuY2x1cyA8LSBucm93KG1ldGEuZGZbbWV0YS5kZltbbWV0YS5jb2xdXSA9PSByb3cuaWQsXSkKCQkJZm9yKGNvbC5pZCBpbiBjb2xuYW1lcyhlbnJpY2guZGYpKXsKCQkJCW51bS54IDwtIG5yb3cobWV0YS5kZlsobWV0YS5kZltbbWV0YS5jb2xdXSA9PSByb3cuaWQpICYgKG1ldGEuZGYkY2x1c3QuSUQgPT0gY29sLmlkKSxdKQoJCQkJcGN0LnggPC0gYXMuaW50ZWdlcihudW0ueCAvIHRvdC5jbHVzICoxMDApCgkJCQkjIHByaW50KHBjdC54KQoJCQkJZW5yaWNoLmRmW3Jvdy5pZCwgY29sLmlkXSA8LSBwY3QueAoJCQl9CgkJfQoJCWNvbG5hbWVzKGVucmljaC5kZikgPC0gc2FwcGx5KGNvbG5hbWVzKGVucmljaC5kZiksIGZ1bmN0aW9uKHgpIHBhc3RlMCgib2xkY2x1c3RlciIsIHgpKQoJCXJvd25hbWVzKGVucmljaC5kZikgPC0gc2FwcGx5KHJvd25hbWVzKGVucmljaC5kZiksIGZ1bmN0aW9uKHgpIHBhc3RlMCgibmV3Y2x1c3RlciIsIHgpKQoJCXhsc3g6OndyaXRlLnhsc3goZW5yaWNoLmRmLCBmaWxlID0gcGFzdGUwKCJQY3RPZk5ld0NsdXN0ZXJzT3ZlcmxhcHBpbmdPbGRDbHVzdGVyc18iLCBwcm9qZWN0TmFtZSwgIl9kaW0iLCBuZGltcywgIi54bHN4IiksIHNoZWV0TmFtZSA9IHBhc3RlMChnc3ViKCJSTkFfc25uXyIsICIiLCBtZXRhLmNvbCkpLCBhcHBlbmQgPSBUUlVFKQoJCXByaW50KGVucmljaC5kZikKCX0KfQoKYGBgCkFic29sdXRlbHkgdGVycmlibGUgb3ZlcmxhcCwgbm8gZW5yaWNobWVudCBvZiBhbnkgb2YgdGhlc2UgYWNyb3NzIHRoZSBuZXcgY2x1c3RlcmluZyBhbGdvcml0aG0uIE1heWJlIHNob3VsZCB0cnkgOTUlIHZhcmlhdGlvbiBjb3ZlcmVkCgojIyBGaW5kIG9sZCBjZWxscyBvbiBVTUFQCgp0aW1lIGZvciB0aGUgc3VwZXIgc2NhcmV5IG1vbWVudCB0byBzZWUgaWYgdGhlIGNlbGxzIGZyb20gc2V1cmF0djEgc3RpbGwgY2x1c3RlciB0b2dldGhlciBvbiBpbiBzZXVyYXQgdjQKCmBgYHtyIGZpZy53aWR0aCA9IDJ9CkRpbVBsb3QoY21wLm9iamVjdCwKCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwKCQkJCWdyb3VwLmJ5ID0gImNsdXN0LklEIiwgCgkJCQlwdC5zaXplID0gLjEsCgkJCQkjIHNwbGl0LmJ5ID0gIm9yaWcuaWRlbnQiLAoJCQkJY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIiksKQpgYGAKYGBge3IgZmlnLndpZHRoID0gNH0KRGltUGxvdChjbXAub2JqZWN0LAoJCQkJcmVkdWN0aW9uID0gInVtYXAiLAoJCQkJZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIsIAoJCQkJc3BsaXQuYnkgPSAiY2x1c3QuSUQiLAoJCQkJY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIiksKQpgYGAKCgoKIyMjIEdlbmUgZXhwcmVzc2lvbiBvZiBvbGQgY2x1c3RycyBvbiBuZXcgbWFwCkxldCdzIHNlZSBpZiB3ZSBjYW4gZ2V0IHNvbWUgZ2VuZSBleHByZXNzaW9uIHByb2ZpbGVzIG9uIHRoZXNlLi4uCmBgYHtyLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTh9CmdlbmUubGlzdCA8LSBjKCJHYXRhMSIsICJHYXRhMiIsICJQZjQiLCAiRG50dCIsICJNcG8iLCAiTWVpczEiLCAiSXJmOCIsICJFbGFuZSIsICJGbGkxIiwgIlpmcG0xIikKVmxuUGxvdChjbXAub2JqZWN0LCBmZWF0dXJlcyA9IGdlbmUubGlzdCwgZ3JvdXAuYnkgPSAiY2x1c3QuSUQiLCBwdC5zaXplID0gMC4wMSwgY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIikpCmBgYAoKClVzZWQgdGhlIGV4Y2UgZG9jIHRvIGRvIHNvbWUgZmFuY3kgY29uZGl0aW9uYWwgZm9ybWF0dGluZy4gT2xkIGNsdXN0ZXIgMTcgaXMgcHJldHR5IGRpc3BlcnNlZCB1bnRpbCB5b3UgaXQgcmVzb2x1dGlvbiAyLjUuIE90aGVyaXNlLCBjZWxscyBpbiBvbGQgY2x1c3RlciAxNyBkbyBub3QgY29uc3RpdHV0ZSBtb3JlIHRoYW4gNDAlIG9mIGFueSBjZWxscyBpbiB0aGUgbmV3IGNsdXN0ZXJzLiAgCkFzIGZhciBhcyBJIGNhbiBzZWUsIHRoZSB0d28gYXBwcm9hY2hlcyBhcmUgdG8gZG8gREdFb2YgbmV3IENNUCB3LyByZXNvbHV0aW9uID0gMi41LCBBTkQvT1IgZG8gREdlIHVzaW5nIG9sZGVyIGNsdXN0ZXIgSURzLiBTdXJlIHNlZW1zIHRvIG1ha2Ugc2Vuc2UgdG8gZG8gYm90aC4uLgoKCiMgREdFIHcvIHJlc29sdXRpb24gPSAyLjUKU3RydCB3aXRoIGNvbXBhcmluZyBhbGwgY2x1c3RlcnMgYWdhaW5zdCBhbGwgb3RoZXIgY2x1c3RlcnMKV3JpdGUgb3V0IGNsdXN0ZXIgaW5mbwoKCmNhbGN1bGF0ZSBgRmluZEFsbE1hcmtlcnMoKWAgZm9yIGRpZmZlcmVudCBpZGVudHMgYW5kIHNhdmUgdG8gbmV3IGZpbGUKYGBge3J9CmlkZW50Lmxpc3QgPC0gYygiUk5BX3Nubl9yZXMuMC41IiwgIlJOQV9zbm5fcmVzLjEiLCAiUk5BX3Nubl9yZXMuMS41IiwgIlJOQV9zbm5fcmVzLjIiLCAiUk5BX3Nubl9yZXMuMi41IiwgImNsdXN0LklEIikKZm9yKHRlc3RlZC5pZGVudCBpbiBpZGVudC5saXN0KXsKCUlkZW50cyhjbXAub2JqZWN0KSA8LSB0ZXN0ZWQuaWRlbnQKCWFsbC5tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGNtcC5vYmplY3QpCgl4bHN4Ojp3cml0ZS54bHN4KHggPSBhbGwubWFya2Vyc1ssYygiYXZnX2xvZzJGQyIsICJwX3ZhbF9hZGoiLCAiY2x1c3RlciIsICJnZW5lIildLCAKCQkJCQkJCQkJIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfRmluZEFMTE1hcmtlcnNfcmVzMi41Lnhsc3giKSwgCgkJCQkJCQkJCSBzaGVldE5hbWUgPSB0ZXN0ZWQuaWRlbnQsIAoJCQkJCQkJCQkgY29sLm5hbWVzID0gVFJVRSwgCgkJCQkJCQkJCSByb3cubmFtZXMgPSBGQUxTRSwgCgkJCQkJCQkJCSBhcHBlbmQgPSBUUlVFKQp9CmBgYAoKQ3JlYXRlIGBGaW5kQWxsTWFya2VycygpYCBsaXN0cyBmb3IgR1NFQQpgYGB7ciB9CklkZW50cyhjbXAub2JqZWN0KSA8LSAiUk5BX3Nubl9yZXMuMi41IgpyZXMuMi41LmFsbG1hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoY21wLm9iamVjdCkKYGBgCgojIyBNYXAgSEdOQyBzeW1ib2xzCmBgYHtyfQpNb3VzZTJIdW1hblRhYmxlIDwtIE1vdXNlMkh1bWFuKHJlcy4yLjUuYWxsbWFya2VycyRnZW5lKQoKSEdOQyA8LSB3aXRoKE1vdXNlMkh1bWFuVGFibGUsIE1vdXNlMkh1bWFuVGFibGUkSEdOQ1ttYXRjaChyZXMuMi41LmFsbG1hcmtlcnMkZ2VuZSwgTW91c2UySHVtYW5UYWJsZSRNR0kpXSkKaGVhZChyZXMuMi41LmFsbG1hcmtlcnMpCnJlcy4yLjUuYWxsbWFya2VycyRIR05DIDwtIEhHTkMKdGFpbChyZXMuMi41LmFsbG1hcmtlcnMpCnNpZy5yZXMuMi41IDwtIHJlcy4yLjUuYWxsbWFya2Vyc1tyZXMuMi41LmFsbG1hcmtlcnMkcF92YWxfYWRqIDw9IDAuMDUsIF0Kc2lnLnJlcy4yLjUgPC0gc2lnLnJlcy4yLjVbYygiYXZnX2xvZzJGQyIsICJIR05DIiwgImNsdXN0ZXIiKV0Kc2lnLnJlcy4yLjUgPC0gc2lnLnJlcy4yLjVbIShzaWcucmVzLjIuNSRIR05DID09ICIiIHwgaXMubmEoc2lnLnJlcy4yLjUkSEdOQykpLF0gIyBHU0VBIHdpbGwgZmFpbCBpZiB0aGVyZSBhcmUgYW55IGJsYW5rcyBvciBOQXMgaW4gdGhlIHRhYmxlCnNpZy5yZXMuMi41IDwtIHNpZy5yZXMuMi41W10KCmBgYAoKCmBgYHtyfQpmb3IoY2x1c3RlciBpbiB1bmlxdWUoc2lnLnJlcy4yLjUkY2x1c3RlcikpewoJcHJpbnQocGFzdGUoIndyaXRpbmcgY2x1c3RlciIsIGNsdXN0ZXIpKQoJbmV3LnRhYmxlIDwtIHNpZy5yZXMuMi41W3NpZy5yZXMuMi41JGNsdXN0ZXIgPT0gY2x1c3RlciwgYygiSEdOQyIsICJhdmdfbG9nMkZDIildCgluZXcudGFibGUgPC0gbmV3LnRhYmxlW29yZGVyKC1uZXcudGFibGUkYXZnX2xvZzJGQyksIF0KCXdyaXRlLnRhYmxlKG5ldy50YWJsZSwgZmlsZSA9IHBhc3RlMCgiUmFua0xpc3RfcmVzMi41X2ZpbmRBbGxfaGduYy9yZXMuMi41Y2x1c3RlciIsIGNsdXN0ZXIsICIucm5rIiksIHF1b3RlID0gRkFMU0UsIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFLCBzZXAgPSAiXHQiLCApCgkKfQpgYGAKCgoKY2FsY3VsYXRlIGBGaW5kTWFya2VycygpYCB0aGF0IGRpc3Rpbmd1aXNoIGVhY2ggY2x1c3RlciAobWlnaHQgb3ZlcmxhYiBiZXR3ZWVuIGNsdXN0ZXJzKQpgYGB7cn0KaWRlbnQubGlzdCA8LSBjKCJSTkFfc25uX3Jlcy4wLjUiLCAiUk5BX3Nubl9yZXMuMSIsICJSTkFfc25uX3Jlcy4xLjUiLCAiUk5BX3Nubl9yZXMuMiIsICJSTkFfc25uX3Jlcy4yLjUiLCAiY2x1c3QuSUQiKQpmb3IodGVzdGVkLmlkZW50IGluIGlkZW50Lmxpc3QpewoJb2JqZWN0LmNvcHkgPC0gY21wLm9iamVjdAoJSWRlbnRzKG9iamVjdC5jb3B5KSA8LSB0ZXN0ZWQuaWRlbnQKCXByaW50KHBhc3RlKCJ0ZXN0aW5nIiwgdGVzdGVkLmlkZW50KSkKCWZvciAoY2x1c3RlciBpbiBzb3J0KGFzLm51bWVyaWMobGV2ZWxzKG9iamVjdC5jb3B5QG1ldGEuZGF0YVtbdGVzdGVkLmlkZW50XV0pKSkpewoJCXByaW50KHBhc3RlKCJsb29raW5nIGF0IGNsdXN0ZXIiLCBjbHVzdGVyKSkKCQljbHVzdGVyLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0LmNvcHksIGlkZW50LjEgPSBjbHVzdGVyKQoJCXRyeSgKCQkJeGxzeDo6d3JpdGUueGxzeCh4ID0gY2x1c3Rlci5tYXJrZXJzWyxjKCJhdmdfbG9nMkZDIiwgInBfdmFsX2FkaiIpXSwgCgkJCQkJCQkJCQkJIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfRmluZE1hcmtlcnNfIiwgZ3N1YigiUk5BX3Nubl8iLCAiIiwgdGVzdGVkLmlkZW50KSwgIi54bHN4IiksIAoJCQkJCQkJCQkJCSBzaGVldE5hbWUgPSBwYXN0ZTAoImNsc3QiLCBjbHVzdGVyKSwgCgkJCQkJCQkJCQkJIGNvbC5uYW1lcyA9IFRSVUUsIAoJCQkJCQkJCQkJCSByb3cubmFtZXMgPSBUUlVFLCAKCQkJCQkJCQkJCQkgYXBwZW5kID0gVFJVRSkKCQkpCQoJfQoJcmVtb3ZlKG9iamVjdC5jb3B5KQp9CmBgYAoKCgpgYGB7cn0KZm9yIChjbHVzdGVyIGluIHNvcnQoYXMubnVtZXJpYyhsZXZlbHMoY21wLm9iamVjdEBtZXRhLmRhdGEkUk5BX3Nubl9yZXMuMi41KSkpKXsKCWNsdXN0ZXIubWFya2VycyA8LSBGaW5kTWFya2VycyhjbXAub2JqZWN0LCBpZGVudC4xID0gY2x1c3RlcikKCXhsc3g6OndyaXRlLnhsc3goeCA9IGNsdXN0ZXIubWFya2Vyc1ssYygiYXZnX2xvZzJGQyIsICJwX3ZhbF9hZGoiKV0sIAoJCQkJCQkJCQkgZmlsZSA9IHBhc3RlMChwcm9qZWN0TmFtZSwgIl9GaW5kTWFya2Vyc19yZXMyLjUueGxzeCIpLCAKCQkJCQkJCQkJIHNoZWV0TmFtZSA9IHBhc3RlMCgiY2xzdCIsIGNsdXN0ZXIpLCAKCQkJCQkJCQkJIGNvbC5uYW1lcyA9IFRSVUUsIAoJCQkJCQkJCQkgcm93Lm5hbWVzID0gVFJVRSwgCgkJCQkJCQkJCSBhcHBlbmQgPSBUUlVFKQp9CmBgYAoKIyMgQ29tYmluZSBjbHVzdGVycyB0aGF0IG1pZ2h0IHJlcHJlc2VudCBvbGQgY2x1c3RlciBpZHMKCiMgREdFIHcvIG1ldGFkYXRhIGFnYWluc3QgY2x1c3QuSUQgYWdhaW5zdCAiMCIKcmVzZXQgaWRlbnQgYXMgImNsdXN0LklEIiBhbmQgcmVydW4gYEZpbmRBbGxNYXJrZXJzKClgCmBgYHtyfQoJSWRlbnRzKGNtcC5vYmplY3QpIDwtICJjbHVzdC5JRCIKCWFsbC5tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGNtcC5vYmplY3QpCgl4bHN4Ojp3cml0ZS54bHN4KHggPSBhbGwubWFya2Vyc1ssYygiYXZnX2xvZzJGQyIsICJwX3ZhbF9hZGoiLCAiY2x1c3RlciIsICJnZW5lIildLCAKCQkJCQkJCQkJIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfRmluZEFMTE1hcmtlcnNfY2x1c3RJRC54bHN4IiksIAoJCQkJCQkJCQkgc2hlZXROYW1lID0gImNsdXN0SUQiLCAKCQkJCQkJCQkJIGNvbC5uYW1lcyA9IFRSVUUsIAoJCQkJCQkJCQkgcm93Lm5hbWVzID0gRkFMU0UsIAoJCQkJCQkJCQkgYXBwZW5kID0gVFJVRSkKYGBgCgoKYGBge3J9CiMgSWRlbnRzKGNtcC5vYmplY3QpIDwtICJjbHVzdC5JRCIKZm9yIChjbHVzdGVyIGluIHVuaXF1ZShjbXAub2JqZWN0QG1ldGEuZGF0YSRjbHVzdC5JRCkpewoJcHJpbnQoY2x1c3RlcikKCWNsdXN0ZXIubWFya2VycyA8LSBGaW5kTWFya2VycyhjbXAub2JqZWN0LCBpZGVudC4xID0gY2x1c3RlcikKCXhsc3g6OndyaXRlLnhsc3goeCA9IGNsdXN0ZXIubWFya2Vyc1ssYygiYXZnX2xvZzJGQyIsICJwX3ZhbF9hZGoiKV0sIAoJCQkJCQkJCQkgZmlsZSA9IHBhc3RlMChwcm9qZWN0TmFtZSwgIl9GaW5kTWFya2Vyc19jbHVzdElELnhsc3giKSwgCgkJCQkJCQkJCSBzaGVldE5hbWUgPSBwYXN0ZTAoIm9sZGNsdXN0IiwgY2x1c3RlciksIAoJCQkJCQkJCQkgY29sLm5hbWVzID0gVFJVRSwgCgkJCQkJCQkJCSByb3cubmFtZXMgPSBUUlVFLCAKCQkJCQkJCQkJIGFwcGVuZCA9IFRSVUUpCn0KCmBgYAoKCiMgRGlzdGluZ3Vpc2hpbmcgZmVhdHVyZXMgb2YgY2x1c3RlcnMKUHJldmlvdXNseSBkZWZpbmVkIGJpb21hcmsgZ2VuZXMgYmFzZWQgb24gUEMgY29udHJpYnV0aW9ucy4gT3JpZ2luYWwgbGlzdCB3YXMgYmFzZWQgb24gKmFsbCogbXNBZ2dyLCBidXQgbGV0J3Mgc2VlIGhvdyBDTVAgc3Vic2V0IGRvZXM/CmBgYHtyIGZpZy5oZWlnaHQgPSAzMCwgZmlnLndpZHRoPTZ9ClZpekRpbUxvYWRpbmdzKGNtcC5vYmplY3QsIGRpbXMgPSAxOjEwLCBuZmVhdHVyZXMgPSAzMCwgcmVkdWN0aW9uID0gInBjYSIsIG5jb2wgPSAyKQpgYGAKCmBgYHtyfQpwY2EuZGYgPC0gY21wLm9iamVjdFtbInBjYSJdXQpwY2EuZGYgPC0gYXMuZGF0YS5mcmFtZShhcy5tYXRyaXgoc2xvdChvYmplY3QgPSBwY2EuZGYsIG5hbWUgPSAiZmVhdHVyZS5sb2FkaW5ncyIpKSkKcHJpbnQoY21wLm9iamVjdFtbInBjYSJdXSwgZGltcyA9IDIsIG5mZWF0dXJlcyA9IDUpCnJvd25hbWVzKHBjYS5kZltwY2EuZGYkUENfMiAlaW4lIHNvcnQocGNhLmRmJFBDXzIsIGRlY3JlYXNpbmcgPSBUUlVFKVsxOjVdLCBdKQpyb3duYW1lcyhwY2EuZGZbcGNhLmRmJFBDXzIgJWluJSBzb3J0KHBjYS5kZiRQQ18yKVsxOjVdLCBdKQpgYGAKCm5vdyB3ZSBjYW4gZ2V0IGEgbGlzdCBvZiBwcmluY2lwYWwgY29tcG9uZW50cyEgIApmaXJzdCBwdWxsIHRoZSBsaXN0IG9mIG9sZEFuYWx5c2lzIENNUCB0b3AgUEMgZ2VuZXMKYGBge3J9CmNtcC5iaW9tYXJrIDwtIHJlYWQudGFibGUoZmlsZSA9ICIvVXNlcnMvaGV1c3RvbmVmL0Rlc2t0b3AvQ01QU3VicG9wcy9CaW9NYXJrL1Byb2JlUGFuZWxzL0NNUF9QQ1RvcEdlbmVzLnR4dCIsIHNlcCA9ICJcdCIsIGhlYWRlciA9IFRSVUUpCmJpb21hcmsuY21wdGFyZ2V0cyA8LSBjKCkKZm9yKGRmLmNvbCBpbiAxOm5jb2woY21wLmJpb21hcmspKXsKCWJpb21hcmsuY21wdGFyZ2V0cyA8LSBjKGJpb21hcmsuY21wdGFyZ2V0cywgYmlvbWFya1ssZGYuY29sXSkKfQpwcmludChjb2xuYW1lcyhiaW9tYXJrKSkKcHJpbnQocGFzdGUoInRvdGFsIGdlbmUgY291bnQ6IiwgbGVuZ3RoKGJpb21hcmsuY21wdGFyZ2V0cykpKQpgYGAKCk5vdyBnZXQgdGhlIGxpc3Qgb2YgY3VycmVudCBwYyBnZW5lIHRyZ2V0cyAob2xkQW5hbHlzaXMgdXNlZCBuZGltID0gMTo2LCBzbyB3ZSdsbCBzdGFydCB3aXRoIHRoYXQgcmFuZ2UpCmBgYHtyfQpwYy5saXN0IDwtIGMoIlBDXzEiLCAiUENfMiIsICJQQ18zIiwgIlBDXzQiLCAiUENfNSIsICJQQ182IikKcGMuZ2VuZXMgPC0gbGFwcGx5KHBjLmxpc3QsIGZ1bmN0aW9uKHgpIHJvd25hbWVzKHBjYS5kZltwY2EuZGZbW3hdXSAlaW4lIHNvcnQocGNhLmRmW1t4XV0sIGRlY3JlYXNpbmcgPSBUUlVFKVsxOjMwXSxdKSkgI3RhcmdldGluZyByb3VnaGx5IDE4MCBnZW5lcyBsaWtlIGluIGJpb21hcmsuY21wdGFyZ2V0cwpwYy5nZW5lcyA8LSB1bmlxdWUodW5saXN0KHBjLmdlbmVzKSkKcHJpbnQocGFzdGUoInRvdGFsIGdlbmUgY291bnQ6IiwgbGVuZ3RoKHBjLmdlbmVzKSkpCmBgYAoKTm93IGNvbXBhcmUgdGhlIGxpc3RzLCBJIGd1ZXNzOgoKYGBge3J9CiMgc2V0ZGlmZih4LHkpIGdpdmVzIHlvdSB0aGluZ3MgaW4geCBub3QgaW4geS4gc2V0ZGlmZih5LHgpIGdpdmVzIHlvdSB0aGluZ3MgaW4geSBub3QgaW4geApzZXRkaWZmKGJpb21hcmsuY21wdGFyZ2V0cywgcGMuZ2VuZXMpCiMgcHJpbnQocGFzdGUoIlxuIGxlbmd0aDoiLCBsZW5ndGgoc2V0ZGlmZihiaW9tYXJrLmNtcHRhcmdldHMsIHBjLmdlbmVzKSkpKQp3cml0ZUxpbmVzKGMoIiIsICJsZW5ndGg6IiwgbGVuZ3RoKHNldGRpZmYoYmlvbWFyay5jbXB0YXJnZXRzLCBwYy5nZW5lcykpKSkKYGBgClVtbSwgeWVhaCB0aGF0IHdlbnQga2luZGEgaG93IEkgZXhwZWN0ZWQuIExldCdzIGRvIHRoaXMgYWdhaW4sIGJ1dCBmb3IgdGhlIGFjdHVhbCBiaW9tYXJrIGdlbmUgbGlzdHMuCmBgYHtyfQpiaW9tYXJrIDwtIHJlYWQudGFibGUoZmlsZSA9ICIvVXNlcnMvaGV1c3RvbmVmL0Rlc2t0b3AvQ01QU3VicG9wcy9CaW9NYXJrL1Byb2JlUGFuZWxzL0Jpb21hcmtQcm9iZUxpc3QudHh0Iiwgc2VwID0gIlx0IikKYmlvbWFyayA8LSBiaW9tYXJrWywxXQpzZXRkaWZmKGJpb21hcmssIHBjLmdlbmVzKQp3cml0ZUxpbmVzKGMoIiIsICJsZW5ndGg6IiwgbGVuZ3RoKHNldGRpZmYoYmlvbWFyaywgcGMuZ2VuZXMpKSkpCmBgYAoKCldoYXQgaWYgd2UgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBwY3MgYnV0IGRlY3JlYXNlIHRoZSBkZXB0aCBvZiBlYWNoPyBUaGlzIG1pZ2h0IGNvdmVyIG1vcmUgb2YgYGJpb21hcmsJYCwgd2hpY2ggd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIHVzaW5nIG1zQWdnciBpbnN0ZWFkIG9mIG9ubHkgdGhlIENNUCBzdWJzZXQKYGBge3J9CnBjLmxpc3QgPC0gYygiUENfMSIsICJQQ18yIiwgIlBDXzMiLCAiUENfNCIsICJQQ181IiwgIlBDXzYiLCAiUENfNyIsICJQQ184IiwgIlBDXzkiLCAiUENfMTAiKQpwYy5nZW5lcyA8LSBsYXBwbHkocGMubGlzdCwgZnVuY3Rpb24oeCkgcm93bmFtZXMocGNhLmRmW3BjYS5kZltbeF1dICVpbiUgc29ydChwY2EuZGZbW3hdXSwgZGVjcmVhc2luZyA9IFRSVUUpWzE6MjBdLF0pKQpwYy5nZW5lcyA8LSB1bmlxdWUodW5saXN0KHBjLmdlbmVzKSkKcHJpbnQocGFzdGUoInRvdGFsIGdlbmUgY291bnQ6IiwgbGVuZ3RoKHBjLmdlbmVzKSkpCgpgYGAKYGBge3J9CnNldGRpZmYoYmlvbWFyaywgcGMuZ2VuZXMpCndyaXRlTGluZXMoYygiIiwgImxlbmd0aDoiLCBsZW5ndGgoc2V0ZGlmZihiaW9tYXJrLCBwYy5nZW5lcykpKSkKYGBgCgpGb3IgY29tcGFyaXNvbiwgbGV0J3MganVzdCBzZWUgaG93IG1hbnkgb2YgYGJpb21hcmsuY21wdGFyZ2V0c2Agd2VyZSBhY3R1YWxseSBpbmNsdWRlZCBpbiBgYmlvbWFya2AKYGBge3J9CnNldGRpZmYoYmlvbWFyay5jbXB0YXJnZXRzLCBiaW9tYXJrKQp3cml0ZUxpbmVzKGMoIiIsICJsZW5ndGg6IiwgbGVuZ3RoKHNldGRpZmYoYmlvbWFyay5jbXB0YXJnZXRzLCBwYy5nZW5lcykpKSkKYGBgCmBgYHtyfQpsZW5ndGgoYmlvbWFyaykgLSBsZW5ndGgoc2V0ZGlmZihiaW9tYXJrLCBiaW9tYXJrLmNtcHRhcmdldHMpKQpgYGAKYGBge3J9Cmxlbmd0aChiaW9tYXJrKSAtIGxlbmd0aChzZXRkaWZmKGJpb21hcmssIHBjLmdlbmVzKSkKYGBgClNvIHdoZW4geW91IGxvb2sgYXQgaXQgbGlrZSB0aGF0LCBpdCdzIG5vdCBhY3R1YWxseSB0aGF0IGZhciBvZmYuCgoKV2hhdCBhcmUgdGhlIHNpbWlsYXJpdGllcz86CmBgYHtyfQpzZXRkaWZmKHNldGRpZmYoYmlvbWFyaywgYmlvbWFyay5jbXB0YXJnZXRzKSwgc2V0ZGlmZihiaW9tYXJrLCBwYy5nZW5lcykpCmBgYApUaGVzZSBhcmUgZ2VuZXMgZnJvbSB0aGUgOTdwcm9iZXMgbm90IGluIHRoZSBvbGQgQ01QIHNldCB0aGF0IGFyZSBhbHNvIG5vdCBpbiB0aGUgbmV3IENNUCBzZXQuIE90aGVyIHRoYW4gSXRnYTJiICh3aGljaCBpcyBhIGZhaWxlZCBwcm9iZSBhbnl3YXkpLCBub3RoaW5nIHNjcmVhbXMuIEFsc28gd2UnZCBoYXZlIHRocm93biBGbHQzIGFuZCBDZDM0IGZvciBpbiBhbnl3YXkgYmVjYXVzZSB0aGV5J3JlIHJlcXVpc2l0ZSBjZWxsIHN1cmZhY2UgbWFya2VycyAoYWxzbyBGbHQzIHN1cmZhY2UgbWFya2VyIGlzIGV4cGVuc2l2ZSBidXQgb3RoZXJ3aXNlIG5vdCBub3Rld29ydGh5IGFuZCBub3QgdXNlZCBpbiB0aGUgY3VycmVudCBzb3J0aW5nIHN0cmF0ZWd5KQoKV2hhdCBhYm91dCBjZWxsIHN1cmZhY2UgbWFya2VyIGV4cHJlc3Npb24/CiogQ2QzNAoqIENkMTYvMzIKKiBDZDkKKiBDZDQxCiogQ2Q0OAoqIFNjYTEgKGp1c3QgdGhyb3cgdGhhdCBpbiBmb3Igc2gqJnMgYW5kIGdpZ2dsZXMpCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTUsIGZpZy53aWR0aD0xMH0Kc3VyZmFjZS5tYXJrZXJzIDwtIGMoIkNkMzQiLCAiRmNncjMiLCAiRmNncjJiIiwgIkNkOSIsICJJdGdhMmIiLCAiQ2Q0OCIsICJMeTZhIikKRmVhdHVyZVBsb3QoY21wLm9iamVjdCwgZmVhdHVyZXMgPSBzdXJmYWNlLm1hcmtlcnMsIHB0LnNpemUgPSAxLCBzcGxpdC5ieSA9ICJjbHVzdC5JRCIsIG5jb2wgPSAxKQpgYGAKU2F2ZSBhcyBwbmcKYGBge3J9CnBuZyhmaWxlbmFtZSA9ICJGZWF0dXJlUGxvdF9DTVBfc3VyZmFjZU1hcmtlcnNfY2x1c3RJRGZhY2V0LnBuZyIsIGhlaWdodCA9IDE2MDAsIHdpZHRoID0gMTYwMCkKRmVhdHVyZVBsb3QoY21wLm9iamVjdCwgZmVhdHVyZXMgPSBzdXJmYWNlLm1hcmtlcnMsIHB0LnNpemUgPSAxLCBzcGxpdC5ieSA9ICJjbHVzdC5JRCIsIG5jb2wgPSAxKQpkZXYub2ZmKCkKYGBgCgoKCgoKCgojIENvbXBhcmUgQGcgaGllcmFyY2hjaWFsIGNsdXN0ZWlybmcKCkRvIGNsdXN0ZXJpbmcgdXNpbmcgYmlvbWFyayBSTkFzIGFzIGlucHV0CmBgYHtyfQojIFJlYWQgaW4gQmlvbWFya1JOQXMKYmlvbWFyay5ybmFzIDwtIHJlYWQudGFibGUoJy9Vc2Vycy9oZXVzdG9uZWYvRGVza3RvcC8xMFhHZW5vbWljc0RhdGEvQmlvbWFya1JOQXMudHh0JykKYmlvbWFyay5ybmFzIDwtIGJpb21hcmsucm5hcyRWMQpgYGAKCnVzZSBiaW9tYXJrIFJOQXMgdG8gZGVmaW5lIGRpbWVuc2lvbmFsIHJlZHVjdGlvbgpgYGB7cn0KY21wLm9iamVjdCA8LSByZWFkUkRTKCJDTVBfcmF3LlJEUyIpCmNtcC5vYmplY3QgPC0gUnVuUENBKGNtcC5vYmplY3QsIGZlYXR1cmVzID0gYmlvbWFyay5ybmFzLCBuZGltcy5wcmludCA9IDE6NSwgLCBuZmVhdHVyZXMucHJpbnQgPSA1KQpFbGJvd1Bsb3QoY21wLm9iamVjdCwgbmRpbXMgPSA1MCkKYGBgCgoKTm93IHJ1biB0aGUgY2x1c3RlcmluZwpgYGB7cn0KdG90LnZhciA8LSBwZXJjZW50LnZhcmlhbmNlKGNtcC5vYmplY3RAcmVkdWN0aW9ucyRwY2FAc3RkZXYsIHBsb3QudmFyID0gRkFMU0UsIHJldHVybi52YWwgPSBUUlVFKQpuZGltcyA8LSBsZW5ndGgod2hpY2goY3Vtc3VtKHRvdC52YXIpIDw9IDkwKSkKCmNtcC5vYmplY3QgPC0gRmluZE5laWdoYm9ycyhjbXAub2JqZWN0LCBkaW1zID0gMTpuZGltcykKY21wLm9iamVjdCA8LSBGaW5kQ2x1c3RlcnMoY21wLm9iamVjdCwgcmVzb2x1dGlvbiA9IDAuNSkKY21wLm9iamVjdCA8LSBSdW5VTUFQKGNtcC5vYmplY3QsIGRpbXMgPSAxOiBuZGltcykKCgpgYGAKCmZpbmQgdGhlIGNsdXN0ZXJzCgpgYGB7cn0KZm9yKHggaW4gYygwLjUsIDEsIDEuNSwgMiwgMi41KSl7CgljbXAub2JqZWN0IDwtIEZpbmRDbHVzdGVycyhjbXAub2JqZWN0LCByZXNvbHV0aW9uID0geCkKfQpgYGAKClBsb3QgdGhlIHVtYXBzIGFuZCBjZWxsIGNsdXN0ZXIgaWRzCmBgYHtyfQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQlteXBsb3QgPC0gRGltUGxvdChjbXAub2JqZWN0LCAKCQkJCQkJCQkJCQlncm91cC5ieSA9IG1ldGEuY29sLAoJCQkJCQkJCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwgCgkJCQkJCQkJCQkJY29scyA9IGNvbG9yLnBhbGV0dGUKCQkJCQkJCQkJCQkpICsgCgkJCWdndGl0bGUocGFzdGUwKHByb2plY3ROYW1lLCAiIGRpbSIsIG5kaW1zLCAicmVzIiwgZ3N1YigiUk5BX3Nubl9yZXMiLCAiIiwgbWV0YS5jb2wpICkpCgkJcGxvdChteXBsb3QpCgl9Cn0KYGBgCiMjIyBDYWxjdWxhdGUgYW50aWNpcGF0ZWQgbnVtYmVyIG9mIGNlbGxzIHlvdSdsbCBmaW5kIGluIGVhY2ggYmlvbWFyayBjbHVzdGVyCkdldCAjIGNlbGxzIGluIGVhY2ggY2x1c3RlcgoKYGBge3J9CnRvdC5jZWxsY291bnQgPC0gbnJvdyhjbXAub2JqZWN0QG1ldGEuZGF0YSkKcmVzMDUubGlzdCA8LSBzb3J0KHVuaXF1ZShjbXAub2JqZWN0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUpLCBkZWNyZWFzaW5nID0gRkFMU0UpCnNhcHBseShyZXMwNS5saXN0LCAKCQkJIGZ1bmN0aW9uKHgpewoJCQkgCXByaW50KAoJCQkgCQlwYXN0ZSgKCQkJIAkJCSJjbHVzdGVyIiwgeCwgIj0iLCAKCQkJIAkJCW5yb3coY21wLm9iamVjdEBtZXRhLmRhdGFbY21wLm9iamVjdEBtZXRhLmRhdGEkUk5BX3Nubl9yZXMuMC41ID09IHgsXSksIAoJCQkgCQkJImNlbGxzIG9yIiwgCgkJCSAJCQlyb3VuZChucm93KGNtcC5vYmplY3RAbWV0YS5kYXRhW2NtcC5vYmplY3RAbWV0YS5kYXRhJFJOQV9zbm5fcmVzLjAuNSA9PSB4LF0pL3RvdC5jZWxsY291bnQqMTAwLCBkaWdpdHMgPSAyKSwgCgkJCSAJCQkiJSBvZiB0b3RhbCIKCQkJIAkJKQoJCQkgCSkKCQkJIH0KCQkJKQpgYGAKClNvIHdlIGRpZCB0aGUgZGltZW5zaW9uYWwgcmVkdWN0aW9uIGJhc2VkIG9uIHRoZSBiaW9tYXJrIFJOQXMsIHRoZW4gZGlkIG91ciBVTUFQIG5lYXJlc3QgbmVpZ2hib3IgY2x1c3RlcmluZy4KCgpJbiB0aGUgYmlvbWFyayBoaWVyYXJjaGNpYWwgY2x1c3RlcmluZyBhbmFseXNpcyBJIGFzc2F5ZWQgMTY3IGNlbGxzLiBUaGUgc21hbGxlc3QgY2x1c3RlciBJIGRldGVjdGVkIGhhZCAzIGNlbGxzLCBvciAxLjglIG9mIHRvdGFsLCBhbmQgdGhpcyBpcyBhbiB1bmNvbWZvcnRhYmx5IHNtYWxsIG51bWJlciBvZiBjZWxscy4gQmFzZWQgb24gdGhlIFVNQVAgY2FsY3VsYXRpb25zIEkgd291bGQgdGhlcmVmb3JlIGV4cGVjdCB0byBmaW5kIDExIG9yIDEyIG9mIHRoZSBwcmVkaWN0ZWQgMTUgY2x1c3RlcnMuIEkgZm91bmQgMTIsIGFuZCBJIGRvbid0IHJlYWxseSBsaWtlIHRoYXQgbGFzdCBvbmUsIHNvIDExIG9yIDEyLiBTaW5jZSBJIGRpZCB0aGUgaGllcmFyY2hjaWFsIGNsdXN0ZXJpbmcgeWVzdGVyZGF5IGFuZCBkaWQgdGhpcyBtYXRoIHRvZGF5LCB3ZSBjYW4gc2F5IGl0IHdhcyBpbmRlcGVuZGVudCBvZiB0aGVzZSByZXN1bHRzIGFuZCB0aGVyZWZvcmUgdG90YWxseSBsZWdpdC4gWWF5ISEKCg==